【发布时间】:2018-04-25 11:50:13
【问题描述】:
// Prints
// Meow!
// I'm a talking cat!
// Callbacks are fun!
function go() {
const messages = ["Meow!", "I'm a talking cat!", "Callbacks are fun!"];
let msg = [];
for (let i = 0; i < messages.length; i++) {
msg.push(function () {
print(messages[i]);
});
}
for (let fct of msg ) {
fct();
}
}
go();
// Prints
// Callbacks are fun!
// Callbacks are fun!
// Callbacks are fun!
function go() {
const messages = ["Meow!", "I'm a talking cat!", "Callbacks are fun!"];
let msg = [];
for (let message of messages) {
msg.push(function () {
print(message);
});
}
for (let fct of msg ) {
fct();
}
}
go();
我了解到 let 使变量具有块作用域并解决了使用 var 声明变量的缺点。即 let 允许每次迭代为变量捕获不同的值。正如我上面的第一个示例所示,这适用于传统的 for 循环。然而,令我惊讶的是,如果我在 ES6 中使用 for..of 循环结构,函数闭包中的每次迭代都不会捕获变量“消息”!这是为什么呢?
【问题讨论】:
-
您确定此代码将第三条消息打印三次吗?它对我有用。
-
后者对我来说也能按预期工作。尽管
console.log()可能是比print()更好的调试选择:) -
我很高兴你们得到了预期的结果。但是,是的,我得到了字符串“回调很有趣!”打印 3 次。嗯..现在我很困惑为什么我得到的结果与你们不同。我应该说我在 Ubuntu604 上,并安装了带有 JavaScript-C24.2.0 版本的 Spidermonkey JS shell。不确定这是否会有所不同。
标签: javascript for-loop let