作用域
作用域的分类有两种,一个静态,一个动态,静态作用域就是我们经常提到的词法作用域,也就是JavaScript采用的作用域。
要理解两者也很简单,词法作用域是在定义的时候,作用域就已经确定了。而动态作用域在函数调用的时候作用域才确定。
下面看段代码,这段代码我们已经从执行上下文的角度分析过了,最后的结果都是‘local scope’。从执行上下文的角度我们看了一遍,下面我们再从词法作用域的角度来看,输出的结果就更容易理解了。
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f();
}
checkscope();
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f;
}
checkscope()();
作用域链
作用域链这个词我们在执行上下文的学习中已经见过了,还是分析的上面这段代码,这段代码真的太牛逼了。
上次我们看的是第一段代码,这次我们从作用域链的角度再来看看第二段代码。
这里我们需要知道函数内部有一个[[scope]]属性,函数创建的时候会保存所有的父变量对象到其中。知道了这里我们再来看代码执行的过程
大概就是这样吧,写出来都有点晕,总之这里的重点是函数内部在创建的时候,已经把作用域确定了!