绑定和作用域

每个绑定都有一个作用域,它是程序的一部分,其中绑定是可见的。 对于在任何函数或块之外定义的绑定,作用域是整个程序 - 您可以在任何地方引用这种绑定。它们被称为全局的。

但是为函数参数创建的,或在函数内部声明的绑定,只能在该函数中引用,所以它们被称为局部绑定。 每次调用该函数时,都会创建这些绑定的新实例。 这提供了函数之间的一些隔离 - 每个函数调用,都在它自己的小世界(它的局部环境)中运行,并且通常可以在不知道全局环境中发生的事情的情况下理解。

letconst声明的绑定,实际上是它们的声明所在的块的局部对象,所以如果你在循环中创建了一个,那么循环之前和之后的代码就不能“看见”它。JavaScript 2015 之前,只有函数创建新的作用域,因此,使用var关键字创建的旧式绑定,在它们出现的整个函数中内都可见,或者如果它们不在函数中,在全局作用域可见。

  1. let x = 10;
  2. if (true) {
  3. let y = 20;
  4. var z = 30;
  5. console.log(x + y + z);
  6. // → 60
  7. }
  8. // y is not visible here
  9. console.log(x + z);
  10. // → 40

每个作用域都可以“向外查看”它周围的作用域,所以示例中的块内可以看到x。 当多个绑定具有相同名称时例外 - 在这种情况下,代码只能看到最内层的那个。 例如,当halve函数中的代码引用n时,它看到它自己的n,而不是全局的n

  1. const halve = function(n) {
  2. return n / 2;
  3. }
  4. let n = 10;
  5. console.log(halve(100));
  6. // → 50
  7. console.log(n);
  8. // → 10