JS执行上下文及执行上下文栈

代码分类

  • 全局代码
  • 函数(局部)代码

全局执行上下文(的产生)

  • 在执行全局代码前将window确定为全局执行上下文
  • 对全局数据进行预处理
    – var定义的全局变量赋值为undefined,添加为window的属性
    – function声明的全局函数, 添加为window的属性
    – this赋值为window
  • 开始执行全局代码

函数执行上下文(的产生)

  • 在调用函数,准备执行函数体之前,创建对应的函数执行上下文对象
  • 对局部数据进行预处理
    – 形参变量赋值为实参,添加为执行上下文的属性
    – arguments赋值为实参列表,添加到执行上下文属性
    – var定义的局部变量赋值为undefined,添加为执行上下文的属性
    – function声明的局部函数, 添加为执行上下文的属性
    – this赋值为调用函数的对象
  • 开始执行函数体的代码

执行上下文栈

  • 在全局代码执行前,js引擎就会创建一个栈来存储管理所有的执行上下文对象
  • 在全局执行上下文(window)确定后,将其添加到栈中(压栈)
  • 在函数执行上下文创建后,将其添加到栈中(压栈)
  • 在当前函数执行完后,将栈顶的对象移除(出栈)
  • 当所有的代码执行完后,栈中只剩下window

测试题

  • 下面的代码依次输出什么内容?
  • 整个过程中产生了几个执行上下文?
console.log('gb: ' + i)
var i = 1
foo(1)
function foo(i) {
	if (i == 4) {
		return
	}
	console.log('foo() begin:' + i)
	foo(i + 1)	// 递归调用
	console.log('foo() end:' + i)
}
console.log('ge: ' + i)

依次输出的内容是:
gb: undefined
foo() begin: 1
foo() begin: 2
foo() begin: 3
foo() end: 3
foo() end: 2
foo() end: 1
ge: 1

共创建了五个执行上下文,分别是
window全局执行上下文
执行foo(1)时创建的函数上下文
执行foo(2)时创建的函数上下文
执行foo(3)时创建的函数上下文
执行foo(4)时创建的函数上下文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tanleiDD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值