执行上下文栈

function foo() {

    console.log('foo1');

}

foo();  // foo2

function foo() {

    console.log('foo2');

}

foo(); // foo

可执行代码

JavaScript中可执行代码有 全局代码,函数代码,eval代码. 当执行一个函数的时候,就会进行准备功能,即 执行上下文(execution context)

执行上下文栈

ECstack =[];

当JavaScript开始要解释代码的时候,最先遇到的是全局代码,所以粗还是哈的时候,就会首先执行上下文栈压入 一个全局执行上下文,我们用globalContext表示它,并且只有当整个应用程序结束的守护,ECstack才会被清空,所以程序结束之前, Ecstack最底部用于有个globalContext; ECstack=[ globalContext ]

function fn3() {
    console.log('fn3')
}

function fn2() {
    fn3()
}

function fn1() {
    fn2();
}

fn1();

当执行一个函数的时候,就会创建一个执行上下文,并且压入执行上下栈,当函数执行完毕的时候,就会将函数的执行上下文从栈中弹出,

//伪代码
//fn1()
ECstack.push(<fn1> functionContext);

//fn1 调用fn2,创建fn2的执行上下文
ECstack.push(<fn2> functionContext);

//fn2 调用fn3,创建fn3的执行上下文
ECstack.push(<fn3> functionContext);

//fn3执行完毕
ECStack.pop();

//fn2执行完毕
ECStack.pop();

//JavaScript接着执行下面的代码,但是ECstack底层永远有个globalContext

思考题

var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f();
}
checkscope();

模拟

//checkscope
ECStack.push(<checkscope>,functionContext);
//f
ECStack.push(<f>,functionContext);

//f
ECStack.pop();
//checkscope
ECStack.pop();

var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f;
}
checkscope()();

解答

//checkscope
ECStack.push(<checkscope>,functionContext);
ECStack.pop();

//f
ECStack.push(<f>,functionContext);
//checkscope
ECStack.pop();

两个例子,执行上下文不同.