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
執行上下文分爲:全局執行上下文和函數執行上下文瀏覽器
是一個抽象的概念中的‘對象’,它用於存儲執行上下文中的:函數
變量this
函數聲明spa
函數參數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
與變量對象同樣,即(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);