JS执行相关

83 阅读1分钟

作用域

JS使用静态作用域(词法作用域)找定义而不是找执行,函数的作用域在其定义的时候就已经决定了

var a = 1;
function check(){
    var a = 2;
    function f(){
        return a;
    }
    return f();
}
checkscope();//2

执行

JS中有三种代码:全局代码、函数代码、eval代码

遇到一段代码时,会操作创建相应的执行上下文栈,执行上下文栈包括:变量对象(VO)、this、作用域链

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

function fun3() {
    console.log('fun3')
}
function fun2() {
    fun3();
}
function fun1() {
    fun2();
}
fun1();
// 伪代码
// fun1()
ECStack.push(<fun1> functionContext);

// fun1中调用了fun2,创建fun2的执行上下文
ECStack.push(<fun2> functionContext);

// fun2还调用了fun3!
ECStack.push(<fun3> functionContext);

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

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

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

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