生成上下文的条件:
- 全局环境,JavaScript运行起来首先进入该环境
- 函数环境,函数调用执行时,进入当前函数中执行代码
- eval(忽略)
JavaScript引擎会以栈的方式处理多个执行上下文,称其为函数调用栈,栈底为全局上下文,栈顶是当前执行上下文。
首先为全局上下文入栈EC,其次遇到函数,产生执行上下文,直到没有执行上下文可产生。代码执行,执行上下文一次出栈。
注意:函数中,遇到return能直接中止可执行代码的执行,可直接弹出当前上下文。
执行上下文特点:
- 单线程
- 同步执行
- 全局上下文只有一个,在浏览器关闭时出栈
- 执行上下文个数没限制
- 每次函数调用都会有新的执行上下文创建,包括函数自调及递归调用
1
2
3
4
5
6
7
8
9var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f();
}
checkscope();
执行上下文栈的变化:
返回f函数的调用,加入执行上下文,入栈,所有调用结束之后,依次出栈。
- ECStack.push(<checkscope> functionContext);
- ECStack.push(<f> functionContext);
- ECStack.pop();
- ECStack.pop();
1 | var scope = "global scope"; |
执行上下文栈的变化:
返回函数本身,没有调用,不生成执行上下文,当checkscope函数调用之后,先出栈,再生成f函数的执行上下文,之后出栈
- ECStack.push(<checkscope> functionContext);
- ECStack.pop();
- ECStack.push(<f> functionContext);
- ECStack.pop();
参考文章:
JavaScript深入之执行上下文–冴羽
执行上下文–这波能反杀
如有错误,烦请指正,谢谢!