js执行上下文
JavaScript中执行环境
1.全局环境
2.函数环境
3.eval函数环境(已不推荐使用)
那么与之对应的执行上下文类型同样有三种
1.全局执行上下文
2.函数执行上下文
3.eval函数行上下文
JavaScript运行时首先会进入全局环境,对应会产生全局上下文。程序代码中基本都会有函数的存在,那么调用函数,就会进入函数执行上环境,对应就会产生函数的执行上下文。
我们都知道,JavaScript是单线程。所以同一时间只能执行一个任务,完成之后才继续下一个任务。既然是这样,那必须有一个排队机制。
JavaScript中管理多个执行上下文
函数编程中,代码中会声明多个函数,对应的执行上下文也会产生多个。在JavaScript中,通过栈的存取方式来管理执行上下文,我们可以称其为执行栈,或函数调用栈(Call Stack)。
在说明栈之前,先给大家看一下栈的结构:
如图:
(栈数据结构)
遵循‘先进后出,后进先出’的规则或称LIFO(“Last In First Out”)规则。
总结栈数据结构的特点:
1.先进后出,后进先出
2.出口在顶部,且仅只有一个
列:
function foo() {
function
bar() {
return 'I am bar';
}
return bar();
}
foo();
上面代码如下图分析:
那么下面代码一共有多少个上下文:
(function foo(i) {
if (i == 3) {
return;
} else {
console.log(i);
foo(++i);
}
})(0);
//全局上下文
//函数上下文0
//函数上下文1
//函数上下文2
//函数上下文
//共产生5个上下文,其中1个全局,4个函数上下文
产生函数上下文,会经历两个阶段:创建阶段、执行阶段
创建阶段:要做的事(确定变量、确定作用域链、确定this的指向)
变量对象(arguments对象、形式参数、字面量函数声明、变量)
执行阶段:执行每一行代码
vo:
(function () {
console.log(typeof foo);
console.log(typeof bar);
var foo = "Hello";
var bar = function () {
return "World";
}
function foo() {
return "good";
}
console.log(foo, typeof foo);
})()
分析vo:
fooExecutionContext = {
variavleObject: {
arguments: { length: 0 },
foo: pointer to function foo(),
bar: undefined
},
scopeChain: {},
this: {}
}