You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对象相关立即调用函数表达式(IIFE)执行步骤及底层机制问询

解析表达式 (p.foo = o.foo)() 的底层运作机制

咱们一步步拆解这个表达式的底层执行逻辑,把你关心的细节说透:

你的初始理解验证

先直接给你答案:你的三个核心理解都是正确的,接下来给你补充关键细节:

  • ✅ o.foo的值会先被临时存储,且存储时还未和p对象关联
  • ✅ o.foo本身不会被执行(只是取它的引用),后续是对这个存储的引用执行调用
  • ✅ p.foo最终会获取o.foo的值(也就是那个foo函数的引用)

详细执行步骤拆解

步骤1:处理赋值表达式 p.foo = o.foo

  1. 首先求值右侧的o.foo:
    • 引擎会先找到对象o,读取它的foo属性值——也就是全局定义的function foo() { console.log( this.a ); }函数的引用(可以理解为指向这个函数在内存中位置的指针)。
    • 这个函数引用会被临时存到引擎的一个内部临时变量里,此时它还没和p对象产生任何关联,只是一个独立的函数引用。
  2. 然后执行赋值操作:
    • 把刚才临时存储的函数引用赋值给p对象的foo属性,从此p.foo就和o.foo指向同一个函数了。
  3. 赋值表达式的返回值:
    • JavaScript中赋值表达式的返回值就是被赋值的那个值,也就是这个函数引用,这是后续执行括号调用的基础。

步骤2:执行函数调用 ()

  1. 调用的对象:
    • 这里调用的是赋值表达式返回的那个临时函数引用,而不是p.foo或者o.foo(虽然它们指向同一个函数,但调用方式决定了this的绑定)。
  2. this的绑定规则(这是最关键的细节):
    • 在非严格模式下,直接调用独立的函数引用(没有通过obj.method()这种属性访问式调用),this会自动绑定到全局对象(浏览器里是window,Node.js里是global)。
    • 在严格模式下,这种直接调用的this会是undefined。
  3. 结合你的代码看执行结果:
    • 你的代码里全局变量a = 2,o.a = 3。如果是非严格模式,执行(p.foo = o.foo)()会输出2,因为this指向全局,读取的是全局的a;如果是严格模式,会抛出TypeError,因为undefined没有a属性。

内容的提问来源于stack exchange,提问作者Alexey Tseitlin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:52:05