js作用域
1、什么是作用域(Scope)
作用域其实就是一个变量绑定的有效范围。
作用域就是一个独立的地盘,让变量不会外泄、暴露出去。也就是说作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突。
ES6 之前 JavaScript 没有块级作用域,只有全局作用域和函数作用域。ES6的到来,为我们提供了‘块级作用域’,可通过新增命令let和const来体现。
2.全局作用域和函数作用域
-
最外层函数 和在最外层函数外面定义的变量拥有全局作用域
-
所有末定义直接赋值的变量自动声明为拥有全局作用域
-
所有window对象的属性拥有全局作用域
一般情况下,window对象的内置属性都拥有全局作用域,例如window.name、window.location、window.top等等。
全局作用域有个弊端:如果我们写了很多行 JS 代码,变量定义都没有用函数包括,那么它们就全部都在全局作用域中。这样就会 污染全局命名空间, 容易引起命名冲突。
函数作用域,是指声明在函数内部的变量,和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部。
3.块级作用域
块级作用域可通过新增命令let和const声明,所声明的变量在指定块的作用域外无法被访问。块级作用域在如下情况被创建:
在一个函数内部
在一个代码块(由一对花括号包裹)内部
let/const 声明并不会被提升到当前代码块的顶部
使用块级作用域可以很好地解决 for循环用var声明变量的问题
作用域链(Scope Chain)
作用域链:当在函数内部访问一个变量时,JavaScript会首先在当前函数的局部作用域中查找该变量。如果找不到,它会向上一级父级作用域(通常是包含该函数的外部函数或全局作用域)继续查找,这个过程会一直向上直到达到全局作用域。
如果在最顶层全局作用域中也没有找到所需的变量,那么会抛出一个引用错误(ReferenceError)。
var globalVar = "I am global"; function outerFunction() { var outerVar = "I am outer"; function innerFunction() { var innerVar = "I am inner"; console.log(innerVar); // 访问自身局部变量 console.log(outerVar); // 访问外层函数的局部变量 console.log(globalVar); // 访问全局变量 } innerFunction(); } outerFunction();
在这个例子中:
-
innerFunction内部可以访问innerVar、outerVar和globalVar。这是因为它们分别存在于innerFunction的局部作用域、outerFunction的局部作用域和全局作用域中。 -
作用域链在这里是:
innerFunction->outerFunction->global。
注意事项
-
使用
let和const创建的变量具有块级作用域,这意味着它们只能在声明的块(通常是{}包围的部分)内部被访问。这有助于避免一些常见的错误,特别是在循环或条件语句中使用时。 -
闭包:当一个函数可以记住并访问其词法作用域,即使当该函数在其原始作用域之外执行时,也会发生闭包。闭包是JavaScript中一个强大的特性,常用于实现模块模式和私有变量。

浙公网安备 33010602011771号