摘要:
在一个JS代码的运行环境下,分全局作用域、局部作用域、块级作用域。例如,常用的浏览器运行环境中,一个浏览器窗口(浏览器标签页)为一个全局作用域。全局作用域之间,是独立运行的,因此不...
在一个JS代码的运行环境下,分全局作用域、局部作用域、块级作用域。
例如,常用的浏览器运行环境中,一个浏览器窗口(浏览器标签页)为一个全局作用域。
全局作用域之间,是独立运行的,因此不可能只通过JavaScript代码就去实现两个全局作用域之间的通信。
因此,运行JavaScript的环境,只会存在一个全局作用域;但会存在多个局部作用域(块级作用域),局部作用域中可以继续包含局部作用域(块级作用域)。
作用域主要影响变量的引用,通常解释为可访问变量的集合。
因此,在ES6之前,没有块级作用域,只有全局作用域和局部作用域;局部作用域的范围是在整个函数方法中。
ES6以后,变量声明增加const和let,新增的这两个变量声明语句,使得变量仅在作用域范围内有效声明。
一个简单的示例:
JavaScript
复制var a = 1;if (true) { var a = 2;}console.log(a); // 输出2
为什么会这样?因为var声明的变量提升了。
JavaScript
复制var a = 1;if (true) { let a = 2; // const 也一样}console.log(a); // 输出1
那么在,ES6+语法中,如何识别一个块级作用域?
简单的来说,一对花括号中的代码块(Block语句)为块级作用域;当然,如果是循环语句中的花括号,每一次循环为一个块级作用域。
那么在作用域中的“骚”操作:
使用未声明的变量名(非数字),去赋值或执行方法,会调用this中的可用属性或方法。
简易示例
JavaScript
复制!function() { this.aaa = '123'; console.log(aaa); // 输出 111}();此篇文章由DurkBlue发布,感谢转载需要请注明来处