写在前面:执行上下文是JavaScript执行环境的抽象概念,例如:在执行某函数时,函数执行的环境包括:作用域,变量对象等。在执行时将执行上下文压入栈中,若里面还包含执行上下文继续压栈,执行完毕后出栈。这个栈就是执行栈。
经典题目加深对执行栈的理解
// A--------------------------
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f();
}
checkscope();
// B---------------------------
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f;
}
checkscope()();
我的理解是,一个是return f() 一个是return f,前者先执行函数再弹出,后者先弹出再执行函数。
所以在执行function f()时,执行栈的内容不同,前者由于先执行再弹出,其执行栈还有checkscope,而后者没有。
除此之外函数的上下文都相同
延伸------>闭包
上例的函数f就是一个闭包
在B中:在函数checkscope已经出栈(上下文销毁)的情况下,仍然访问得到起作用域下变量scope
为什么能访问呢?上下文不是已经销毁了吗?
不要忘记,虽然上下文已经销毁,但是在f的作用域链中还保存了checkscope的AO(activity Object)信息,变量scope在函数f中有使用,还处于活跃状态,没有被清除,存在于内存中
待补充:作用域链的构建过程