在一个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指向对象的可用属性。