作用域及作用域链

288 阅读1分钟

作用域是什么?

作用域就是变量与函数的可访问范围

作用域链又是什么呢?

讲作用域链之前,我们首先要讲一下变量是怎么查找的。

var name = 'window.name';
function foo(){
  var name = 'foo.name';
  console.log(name);
}
function bar(){
  console.log(name);
}
foo(); // foo.name
bar(); // window.name

变量查找的时候,会先从当前执行上下文中查找该变量,如果未找到,就会去父级执行上下文中查找,直到全局执行上下文(如果对于执行上下文不理解,可以看我之前的一篇文章《执行上下文和执行栈》),而变量这种查找的规则就形成了作用域链

但是需要注意的是,我之前的文章讲过

执行上下文的创建阶段:确定this及作用域链,声明函数并初始化,声明变量并赋予默认值undefined,创建arguments对象

接下来看一个例子:

let name = 'window.name';
function foo(){
  console.log(name);
}
function bar(){
  let name = 'bar.name';
  foo();
}
bar(); // window.name

所以写代码的时候不要被自己绕晕了

如果有错误或者不严谨的地方,请给予指正,十分感谢!