javaScript 執行上下文

  • EC 函數執行環境(執行上下文),Execution Context
  • ECS 執行環境棧,Execution Context Stack
  • VO 變量對象 Variable Object (聲明時,未執行)
  • AO 活動對象 Active Object (聲明以後,在執行語句時)
  • scope chain 做用域鏈

EC

  1. 全局代碼:不包括函數體內的代碼
  2. 函數代碼:函數體內的代碼(不包括函數體內的函數的內部代碼)
  3. Eval代碼:Eval內部代碼

ECS

函數執行棧,在函數VO時入站,執行完AO時出棧ide

let a = 'Hello World!';

function first() {
  console.log('Inside first function');
  second();
  console.log('Again inside first function');
}

function second() {
  console.log('Inside second function');
}

first();
console.log('Inside Global Execution Context');

首先生命first入棧,以後生命second入棧,以後執行first可是first中執行了second,second執行完出棧,以後執行完first。函數

VO

在執行上下文時,參數聲明,函數聲明,變量的聲明。
參數聲明》函數聲明》變量聲明
若是變量對象已經包含了相同名字的屬性,則替換它的值this

function foo1(a){
    console.log(a)
    function a(){} 
}
foo1(20)//'function a(){}'

此時console.log(a),已經完成了VO階段,也就上聲明階段,因爲函數後聲明,全部輸出爲函數。
若是變量名和已經聲明的函數名或者函數的參數名相同,則不會影響已經存在的屬性spa

function foo1(a){
    console.log(a)
    function a(){} 
    var a =1;
}
foo1(20)//'function a(){}'

函數的聲明比變量優先級要高,而且定義過程不會被變量覆蓋,除非是賦值指針

AO

function foo(i){
    var a = 'hello'
    var b = function(){}
    function c(){}
}
foo(22)

vo階段code

ECObj = {
    scopChain: {...},
     variableObject: {
        arguments: {
            0: 22,
            length: 1
        },
        i: 22,
        c: pointer to function c()
        a: undefined,
        b: undefined
    },
    this: { ... }
}

ao階段對象

ECObj = {
    scopeChain: { ... },
    variableObject: {
        arguments: {
            0: 22,
            length: 1
        },
        i: 22,
        c: pointer to function c()
        a: 'hello',
        b: pointer to function privateB()
    },
    this: { ... }
}

此時的console.log(typeof foo); console.log(typeof bar); 在函數的聲明以後階段(vo)blog

(function() {
    console.log(typeof foo); // 函數指針
    console.log(typeof bar); // undefined

    var foo = 'hello',
        bar = function() {
            return 'world';
        };
        
    function foo() {
        return 'hello';
    }
}());

此時的console.log()爲執行以後階段(ao)作用域

(function() {
    var foo = 'hello',
        bar = function() {
            return 'world';
        };
        
    function foo() {
        return 'hello';
    }
    
    console.log(typeof foo); // string
    console.log(typeof bar); // function
}());
相關文章
相關標籤/搜索