为何let声明的foo函数在setTimeout中执行输出为1而非2?
为什么输出是1而不是2?
先看你的代码:
let foo = function(){ console.log(1); } setTimeout (foo,1000); foo = function(){ console.log(2); }
核心原因在于setTimeout的工作逻辑:
- 当你调用
setTimeout(foo, 1000)时,JavaScript会立刻把当前foo指向的那个打印1的函数的引用存起来,等着1秒后执行。 - 之后你把foo重新赋值成打印2的函数,只是改变了foo这个变量的指向,但之前传给setTimeout的那个旧函数引用已经被单独保存了,不会跟着foo的变化而变。
- 1秒时间到后,setTimeout执行的是它之前存好的旧函数,所以输出的是1。
说白了,setTimeout拿的是当时函数的“快照”,不是变量本身,变量后来怎么改都不影响已经存好的那个函数。
内容的提问来源于stack exchange,提问作者sujithrakumaran
相关产品推荐
相关产品推荐

