【发布时间】:2021-08-03 09:59:12
【问题描述】:
当我运行以下代码时:
let fn = () => console.log('original fn was called');
fn();
setTimeout(fn.bind(this), 250);
setTimeout(() => fn(), 500);
setTimeout(fn, 750);
fn = () => console.log('updated fn was called');
这是输出:
original fn was called
original fn was called
updated fn was called
original fn was called
我直观地理解为什么输出前两行:
- 立即调用该函数。
-
bind方法从fn生成一个新函数,因此“锁定”了它的行为。
但是,我对为什么第 3 行和第 4 行不同感到困惑。我想在第三种情况下,在调用包装匿名函数之前,不会评估对 fn 的引用。因此,它将利用 fn 的更新实现是有道理的。但是第4种情况,为什么setTimeout不使用最新版的fn呢?
【问题讨论】:
-
闭包按名称进行延迟查找,其余部分急切地引用原始函数对象
标签: javascript settimeout pass-by-reference