JavaScript编程精解(原书第3版)
上QQ阅读APP看书,第一时间看更新

3.2 绑定和作用域

每个绑定都有一个作用域,它是程序中此绑定可见的一部分。对于在任何函数或块之外定义的绑定,作用域是整个程序意味着你可以在任何地方引用此类绑定。这些被称为全局绑定

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

用let和const声明的绑定实际上是在声明它们的中局部可见的,所以如果你在循环中创建上面两种中的一种绑定,循环之前和之后的代码都不能“看到”它。在2015年之前的JavaScript中,只有函数才能创建新的作用域,因此使用var关键字创建的旧式绑定在出现它们的整个函数中是可见的,如果它们不在一个函数中,则它们在全局作用域内可见。

var声明的z未在函数中,所以它的作用域是全局的。——译者注

每个作用域都可以“查看”包围它的作用域,因此x在示例中的块内部是可见的。异常情况是多个绑定具有相同的名称——在这种情况下,代码只能看到最里面的一个。例如,当halve函数内的代码引用n时,它会看到自己的n,而不是全局的n。

嵌套作用域

JavaScript不仅区分全局绑定局部绑定。它还可以在其他块和函数内创建块和函数,从而产生多个度的局部。

例如,下面这个函数会输出制作一批鹰嘴豆泥所需的成分,在它内部有另一个函数:

ingredient函数内的代码可以看到外部函数的factor绑定。但是它的局部绑定(例如unit或ingredientAmount)在外部函数中是不可见的。

块内可见的绑定集由程序文本中此块的位置确定。每个局部作用域可以查看包含它的所有局部作用域,并且所有作用域都可以看到全局作用域。这种绑定可见性的方法称为词法作用域