Javascript - 执行上下文

概念

一、执行上下文: (Execution Context,缩写 EC)

    console.log('EC0');
    function funcEC1(){
        console.log('EC1');
        function funcEC2(){
            console.log('EC2');
            var funcEC3 = function(){
                console.log('EC3');
            };
        }
        funcEC2();
    }
    funcEC1();

在Javascript引擎解析上述代码时在执行函数会依次将其添加到栈(Stack)中,即(ECO(Global),EC1,EC2),如下图所示:
Javascript - 执行上下文

执行上下文分为:全局执行上下文和函数执行上下文

二、变量对象:(Variable Object VO)

是一个抽象的概念中的‘对象’,它用于存储执行上下文中的:

  1. 变量

  2. 函数声明

  3. 函数参数

var a = 10;
    function test(x){
        var b = 20;
    }
    test(30);

Javascript引擎会将其解析为:

 VO(globalContext) = {
        a: 10,
        test: <ref to function>
    };
    VO(test functionContext){
        x:30,
        b:20
    };

在浏览器中全局上下文变量对象为window,而在nodejs中全局上下文变量对象为global。
当js代码运行前,在全局执行上下文中(浏览器)中就会默认添加一些变量,
如:Math,String,isNaN,window,所以在调用代码时:

String(10);             //[[global]].String(10)
window.a = 10;         //[[global]].window.a = 10
this.b = 20;             //[[global]].b = 20

三、函数中的**对象:(Active Object AO)

与变量对象一样,即(VO(functionContext) === AO);
只不过AO多了一个变量,为arguments:

 arguments = {
        callee,
        length,
        properties-indexes
    };

这个可选择性忽略,没什么用.

函数调用中的执行上下文

代码如下:

    function test(a, b){
        var c = 10;
        function d(){}
        var e = function _e(){};
        (function(){})();
        b = 20;
    }
    test(10);