作用域和作用域链

91 阅读1分钟

1.作用域

1.1 什么是作用域?

作用域就是定义变量的区域,它决定了当前执行代码对变量的访问权限。

1.2 作用域的分类

  • 全局作用域:最外层作用域,一直存在。
  • 函数作用域:函数被定义时会创建。
  • 块级作用域:let、const、try catch

执行代码可以访问到自己的作用域和外层作用域中的变量,而无法访问到内层作用域。

1.3 作用域链

function foo(a) {
  var b = a * 2;

  function bar(c) {
    console.log( a, b, c );
  }

  bar(b * 3);
}

foo(2); // 2 4 12

观察如上代码,bar函数内部会做三次RHS查询,但是bar内部只能获取到c的值,ab都是从外部的foo函数的作用域中获取到的。

也就是说当可执行代码内部访问变量时,会先查找本地作用域,如果找到目标变量则返回,否则就继续去父级作用域中继续查找,一直查找到全局。这种作用域的嵌套机制,我们称为作用域链。

1.4 词法作用域

我们知道函数在被定义时,作用域也就确定了,和在哪里调用无关,所以这个作用域叫做词法作用域,也叫静态作用域。

1.5 新增的块级作用域