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

JavaScript中未显式调用函数却自动执行的问题咨询

问题解答:为什么未显式调用f()却导致x变为11?

嘿,这个问题的关键点其实藏在你定义obj对象的代码里——你给g属性赋值的是f(),而不是f!这个括号就是触发函数执行的核心原因,跟“设置obj.g的值”的动作时机没关系,而是在创建obj对象的过程中,JavaScript解析到f()时就立即执行了这个函数。

咱们一步步拆解代码执行的完整流程:

  • 首先执行var x = 10,此时x的值被初始化为10;接着定义函数f,但这时候函数只是被声明,不会执行。
  • 然后开始创建obj对象:
    • 给func属性赋值为f(没有括号),这只是把函数f的引用存到obj.func里,不会触发函数执行。
    • 给g属性赋值为f()(带括号),这就完全不同了——JavaScript看到函数名后跟括号,会立刻调用这个函数,把函数的返回值赋值给obj.g。
  • 当f()执行时:
    1. 第一个console.log(x)输出当前的x值10;
    2. 执行x = x + 1,把x的值从10修改为11;
    3. 第二个console.log(x)更新后的11;
    4. 最后返回11,所以obj.g的实际值是11,而不是函数f本身。
  • 最后执行console.log(x),自然就输出已经被修改后的11了。

总结一下:不是设置obj.g的“动作”触发了f(),而是你写的f()这种带括号的写法,直接让函数在对象初始化阶段就被调用了。如果想把函数f赋值给obj.g而不执行它,只需要去掉括号写成g: f就行。

内容的提问来源于stack exchange,提问作者Caden Wang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:23:59