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);