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),如下图所示:
执行上下文分为:全局执行上下文和函数执行上下文
二、变量对象:(Variable Object VO)
是一个抽象的概念中的‘对象’,它用于存储执行上下文中的:
变量
函数声明
函数参数
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);