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()执行时:- 第一个
console.log(x)输出当前的x值10; - 执行
x = x + 1,把x的值从10修改为11; - 第二个
console.log(x)更新后的11; - 最后返回11,所以
obj.g的实际值是11,而不是函数f本身。
- 第一个
- 最后执行
console.log(x),自然就输出已经被修改后的11了。
总结一下:不是设置obj.g的“动作”触发了f(),而是你写的f()这种带括号的写法,直接让函数在对象初始化阶段就被调用了。如果想把函数f赋值给obj.g而不执行它,只需要去掉括号写成g: f就行。
内容的提问来源于stack exchange,提问作者Caden Wang
相关产品推荐
相关产品推荐

