深入理解JavaScript作用域-作用域链

70 阅读1分钟

前言

javaScript中有一个被称为作用域(scope)的特性,但是对于新手来说,作用域的概念并不是很容易理解,本文我会用尽量简单的方式来解释作用域和作用域链,希望大家都有所收获!

去理解作用域之前 我们来了解一下 当我们要执行下面代码的时候 都发生了什么?
function foo (){
  var m = 10 
}
foo()
var a = 1
console.log(a)

image.png 运行这段代码在调用栈里面的时候,首先会创建一个全局执行上下文(global exection context,下文称GEC), 把GEC放在调用栈里开始执行,然后会开始寻找variable Object(下文称VO)并对里面进行赋值,当执行到foo()时,因为在GO中foo指向内存地址,此时会根据地址找到存储的空间,根据存储内容解析变量,然后执行foo()函数体,函数执行完成后,会弹出调用栈。

当使用到一个变量时,会首先在当前作用域(VO) 中查找该变量,如果在当前作用域没有找到该变量,会向上级作用域递归查找,直到GC,如果仍未找到,那么返回undefined

另外,每个函数在定义之时,其作用域就已经确定了,随之确定还有该函数的作用域链