什么是作用域
作用域是一整套规则,用于确定在哪以及如何查找变量.
理解代码执行过程
举个例子 var a = 2
,编译器会把代码分为两步:
var a
查找作用域是否存在该名称的变量,如果没有,声明一个新的a = 2
引擎执行LHS查询,找到变量的容器本身,以便进行赋值,与之相对应的是RHS查找,可以理解为 retrieve his source value(取到他的原值)
作用域嵌套
当一个块或者一个函数嵌套在另一个块或者函数中时,就发生了作用域的嵌套.
function foo(){
return a
}
var a = 1;
foo()
复制代码
当在函数作用域中无法找到变量a时,引擎就会去上级作用域查找,直到抵达最外层(即全局作用域)
异常
失败的RHS查找会抛出ReferenceError异常,失败的LHS查找会导致自动隐式创建一个全局变量(非严格模式),或者抛出ReferenceError异常(严格模式)