Javascript - 執行上下文

概念

1、執行上下文: (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),以下圖所示:
圖片描述node

執行上下文分爲:全局執行上下文和函數執行上下文瀏覽器

2、變量對象:(Variable Object VO)

是一個抽象的概念中的‘對象’,它用於存儲執行上下文中的:函數

  1. 變量this

  2. 函數聲明spa

  3. 函數參數code

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,因此在調用代碼時:blog

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

3、函數中的激活對象:(Active Object AO)

與變量對象同樣,即(VO(functionContext) === AO);
只不過AO多了一個變量,爲arguments:圖片

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

這個可選擇性忽略,沒什麼用.ip

函數調用中的執行上下文

代碼以下:

function test(a, b){
        var c = 10;
        function d(){}
        var e = function _e(){};
        (function(){})();
        b = 20;
    }
    test(10);
相關文章
相關標籤/搜索