为何代码中第二个console.log()输出2而非1?技术咨询
为啥第二个console.log输出2而非1?
嘿,这个问题问得很到位!咱们一步步拆解这段代码的执行流程,就能搞明白背后的原因啦~
首先先把你的代码清晰列出来:
function f() { console.log(2); } f(); (function() { f(); f = function() { console.log(1); } })();
咱们按代码执行的顺序来分析:
- 第一步:在全局作用域中定义了函数
f,它的功能就是打印数字2。 - 第二步:调用
f(),这时候直接执行原函数,输出第一个2。 - 第三步:执行立即执行函数表达式(IIFE),这个函数会立刻运行内部的代码:
- 先执行
f():这时候f还没有被重新赋值,依然是最初那个打印2的函数,所以这一步输出第二个2。 - 再执行
f = function() { console.log(1); }:这时候才把全局的f替换成了新的函数——这个新函数会打印1。但注意,替换操作是在调用之后才完成的,所以之前的调用用的还是老函数。
- 先执行
简单来说,关键就是执行顺序:IIFE里是先调用老的f,再给f赋值新函数,而不是先赋值再调用。如果把这两行的顺序调换,那第二次输出就会是1啦。
内容的提问来源于stack exchange,提问作者Max Wolfen
相关产品推荐
相关产品推荐

