对象相关立即调用函数表达式(IIFE)执行步骤及底层机制问询
解析表达式
(p.foo = o.foo)() 的底层运作机制 咱们一步步拆解这个表达式的底层执行逻辑,把你关心的细节说透:
你的初始理解验证
先直接给你答案:你的三个核心理解都是正确的,接下来给你补充关键细节:
- ✅
o.foo的值会先被临时存储,且存储时还未和p对象关联 - ✅
o.foo本身不会被执行(只是取它的引用),后续是对这个存储的引用执行调用 - ✅
p.foo最终会获取o.foo的值(也就是那个foo函数的引用)
详细执行步骤拆解
步骤1:处理赋值表达式 p.foo = o.foo
- 首先求值右侧的
o.foo:- 引擎会先找到对象
o,读取它的foo属性值——也就是全局定义的function foo() { console.log( this.a ); }函数的引用(可以理解为指向这个函数在内存中位置的指针)。 - 这个函数引用会被临时存到引擎的一个内部临时变量里,此时它还没和
p对象产生任何关联,只是一个独立的函数引用。
- 引擎会先找到对象
- 然后执行赋值操作:
- 把刚才临时存储的函数引用赋值给
p对象的foo属性,从此p.foo就和o.foo指向同一个函数了。
- 把刚才临时存储的函数引用赋值给
- 赋值表达式的返回值:
- JavaScript中赋值表达式的返回值就是被赋值的那个值,也就是这个函数引用,这是后续执行括号调用的基础。
步骤2:执行函数调用 ()
- 调用的对象:
- 这里调用的是赋值表达式返回的那个临时函数引用,而不是
p.foo或者o.foo(虽然它们指向同一个函数,但调用方式决定了this的绑定)。
- 这里调用的是赋值表达式返回的那个临时函数引用,而不是
this的绑定规则(这是最关键的细节):- 在非严格模式下,直接调用独立的函数引用(没有通过
obj.method()这种属性访问式调用),this会自动绑定到全局对象(浏览器里是window,Node.js里是global)。 - 在严格模式下,这种直接调用的
this会是undefined。
- 在非严格模式下,直接调用独立的函数引用(没有通过
- 结合你的代码看执行结果:
- 你的代码里全局变量
a = 2,o.a = 3。如果是非严格模式,执行(p.foo = o.foo)()会输出2,因为this指向全局,读取的是全局的a;如果是严格模式,会抛出TypeError,因为undefined没有a属性。
- 你的代码里全局变量
内容的提问来源于stack exchange,提问作者Alexey Tseitlin
相关产品推荐
相关产品推荐

