JavaScript作用域

JavaScript作用域

在一个JS代码的运行环境下,分全局作用域、局部作用域、块级作用域。

例如,常用的浏览器运行环境中,一个浏览器窗口(浏览器标签页)为一个全局作用域。

全局作用域之间,是独立运行的,因此不可能只通过JavaScript代码就去实现两个全局作用域之间的通信。

因此,运行JavaScript的环境,只会存在一个全局作用域;但会存在多个局部作用域(块级作用域),局部作用域中可以继续包含局部作用域(块级作用域)。

作用域主要影响变量的引用,通常解释为可访问变量的集合。

因此,在ES6之前,没有块级作用域,只有全局作用域和局部作用域;局部作用域的范围是在整个函数方法中。

ES6以后,变量声明增加const和let,新增的这两个变量声明语句,使得变量仅在作用域范围内有效声明。

一个简单的示例:

var a = 1;
if (true) {
    var a = 2;
}
console.log(a); // 输出2

为什么会这样?因为var声明的变量提升了。

var a = 1;
if (true) {
    let a = 2; // const 也一样
}
console.log(a); // 输出1

那么在,ES6+语法中,如何识别一个块级作用域?

简单的来说,一对花括号中的代码块(Block语句)为块级作用域;当然,如果是循环语句中的花括号,每一次循环为一个块级作用域。


说了这么多作用域的内容,其实就是为了记录一下:

在作用域中的“骚”操作:

使用未声明的变量名(非数字),去赋值或执行方法,会调用this指向对象的可用属性。