在'For'和'For-of'循环中阻止范围变量

时间:2017-11-12 20:12:55

标签: javascript for-loop let

// 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'!这是为什么?

2 个答案:

答案 0 :(得分:0)

原来我的JS shell非常过时。当移动到最新的SpiderMonkey 45时,它按预期工作。

答案 1 :(得分:-1)

我认为问题在于您如何使用.push()方法。 尝试下面的代码,它将使用任一语法正确地控制记录您的数组。

在这种情况下,var和let都会有相同的结果。 您声明的所有变量只在其声明的函数中具有范围。

/console.developers.google.com