针对有经验的开发者,纠正一个过时的理解:你可能听过这句话“javascript没有块级作用域”。所谓“块”,就是大括号“{}”中间的语句。诚然,在ES6之前,这句话是完全正确的,但ES中新增的两个命令let和const,改变了这种状态,使得js也有了块级作用域的概念。详见:http://www.cnblogs.com/giggle...
而且,在不使用ES6新语法的前提下,“javascript没有块级作用域”的正确理解应该是“javascript只有全局作用域和函数作用域”。
var a = 1;
if(a) {
var b = 2;
}
for (var c = 3; c < 10; c++) {
//......
}
所以,上述代码中的a、b、c皆是全局作用域中的全局变量。
作用域是一个很抽象的概念,类似于一个“地盘”:
如上图,全局代码和fn、bar两个函数都会形成一个作用域。而且,作用域有上下级的关系,上下级关系的确定就看函数是在哪个作用域下创建的。例如,fn作用域下创建了bar函数,那么“fn作用域”就是“bar作用域”的上级。
作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突。例如以上代码中,三个作用域下都声明了“a”这个变量,但是他们不会有冲突。各自的作用域下,用各自的“a”。
与执行上下文环境的关系:
作用域只是一个“地盘”,一个抽象的概念,代码写完就已经将其确定了,是一直存在的,其中没有变量,要通过作用域对应的执行上下文环境来获取变量的值。
执行上下文环境类似于一个“对象”,代码预处理完才会生成,存在被“创建”或被“销毁”的概念,里边存放声明的变量。
同一个作用域下,不同的调用会产生不同的执行上下文环境,继而产生不同的变量的值。
如果要查找一个作用域下某个变量的值,就需要找到这个作用域对应的执行上下文环境,再在其中寻找变量的值。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。