执行上下文
全局执行上下文
创建一个全局的window对象,并规定this指向window,执行js时候就压入栈底,关闭浏览器时才弹出。
函数执行上下文
- 每次函数调用时,会创建一个函数执行上下文;
- 执行上下文分为创建阶段和执行阶段;
创建阶段:函数环境会创建变量对象:arguments对象(并赋值)、函数声明(并赋值)、变量声明(不赋值),函数表达式声明(不赋值);会确定this指向;会确定作用域;
执行阶段:变量赋值、函数表达式赋值,使变量对象编程活跃对象
eval()执行上下文
使用eval()函数时,eval代码被编译并且创建执行上下文。
执行栈
JavaScript引擎是通过“调用栈”来管理执行上下文的;(数据结构栈是一种后进先出的线性结构)。对于JavaScript来说(全局作用域),当代码开始编译时,全局执行上下文会被入栈;当函数被调用时,其执行上下文会被入栈,执行结束后出栈。
示例:
var num1 = 1;
function add(arg1, arg2){
return arg1 + arg2;
}
function sum(arg1, arg2){
let num2 = 2;
let result = add(arg1, arg2);
return result + num1 + num2;
}
sum(3, 4);
(1)创建执行上下文,压入调用栈栈底;
(2)执行赋值操作num1 = 1;
(3)调用sum函数,将sum函数的执行上下文入栈;
(4)执行赋值操作:d=2;
(5)在sum函数中调用add函数,将add函数的执行上下文入栈;
(6)add函数调用结束,返回结果7赋值给result;
(7)sum函数调用结束;
(8)整个js代码执行结束。