// 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();
我了解到让变量块作用域并解决了使用var来声明变量的缺点。即允许每次迭代捕获变量的不同值。这与传统的for循环一起工作,如上面的第一个例子所示。但是,如果我在ES6中使用for..of循环结构,我很惊讶,函数闭包中的每次迭代都没有捕获变量'message'!这是为什么?
答案 0 :(得分:0)
原来我的JS shell非常过时。当移动到最新的SpiderMonkey 45时,它按预期工作。
答案 1 :(得分:-1)
我认为问题在于您如何使用.push()方法。 尝试下面的代码,它将使用任一语法正确地控制记录您的数组。
在这种情况下,var和let都会有相同的结果。 您声明的所有变量只在其声明的函数中具有范围。
/console.developers.google.com