绑定和作用域
每个绑定都有一个作用域,它是程序的一部分,其中绑定是可见的。 对于在任何函数或块之外定义的绑定,作用域是整个程序 - 您可以在任何地方引用这种绑定。它们被称为全局的。
但是为函数参数创建的,或在函数内部声明的绑定,只能在该函数中引用,所以它们被称为局部绑定。 每次调用该函数时,都会创建这些绑定的新实例。 这提供了函数之间的一些隔离 - 每个函数调用,都在它自己的小世界(它的局部环境)中运行,并且通常可以在不知道全局环境中发生的事情的情况下理解。
用let
和const
声明的绑定,实际上是它们的声明所在的块的局部对象,所以如果你在循环中创建了一个,那么循环之前和之后的代码就不能“看见”它。JavaScript 2015 之前,只有函数创建新的作用域,因此,使用var
关键字创建的旧式绑定,在它们出现的整个函数中内都可见,或者如果它们不在函数中,在全局作用域可见。
let x = 10;
if (true) {
let y = 20;
var z = 30;
console.log(x + y + z);
// → 60
}
// y is not visible here
console.log(x + z);
// → 40
每个作用域都可以“向外查看”它周围的作用域,所以示例中的块内可以看到x
。 当多个绑定具有相同名称时例外 - 在这种情况下,代码只能看到最内层的那个。 例如,当halve
函数中的代码引用n
时,它看到它自己的n
,而不是全局的n
。
const halve = function(n) {
return n / 2;
}
let n = 10;
console.log(halve(100));
// → 50
console.log(n);
// → 10