189 8069 5689

简单理解 JavaScript 的词法作用域

作用域

作用域就是一对{},是一个盒子,代码在盒子中运行,按理来说在里面声明的变量(这种变量叫作局部作用域)不能被外界访问,除非访问父盒子的变量。作用域决定了代码生效的区域以及资源(变量、函数)可见的区域。

专注于为中小企业提供网站设计、网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业丹棱免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了近1000家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

function fun() {
  let a = 20;
}();

console.log(a); // Uncaught ReferenceError: a is not defined

fun函数的作用域声明了变量 a,而函数的作用域与console.log(a)所在的作用域不相同,因此,访问变量就报错了。

块级作用域

JS 中存在一个关键字var,它也是用来声明变量的,是 ES5 之前的语法了。但是现在的教材和教程中存在其他两个变量声明的关键字:letconst。var 在函数作用域内声明变量,外界是不能访问的,但是对于 if、for 这类语句的作用域,var 就具有穿透性。

下面我写了一个作用域,我希望变量 x 是不能被外界访问的:

{
  var x = 10;
}

console.log(x) // => 10

for (var i = 0; i < 10; i++) {
  // ...
}

console.log(i); // 10

很明显,for 语句、以及单独的一对{}这种作用域都能被外界访问。ES6 关键字let声明的变量,外部想要使用块级作用域的变量x就会报错:

{
  let x = 10;
}

console.log(x); // Uncaught ReferenceError: x is not defined

for (let i = 0; i < 10; i++) {
  // ...
}

console.log(i); // Uncaught ReferenceError: i is not defined

所以,块级作用域应该完全符合作用域的定义。因为历史原因,JS 还依旧可以使用var关键字声明变量,上面已经说明这个关键字的弊端,如果坚持使用,除了函数作用域以外,作用域就不再具有块级作用域的功能。

全局作用域

全局作用域的范围比其他的作用域的范围更大。