在JavaScript中让vs var

Kri*_*hna 5 javascript closures var let

我知道let具有块作用域,而var具有功能作用域。但是我不明白在这种情况下,如何使用let解决问题

const arr = [1,2,3,4];
for (var i = 0; i < arr.length; i++) {
setTimeout(function() {
   console.log(arr[i]) 
}, 1000);
} // Prints undefined 5 times

const arr = [1,2,3,4];
for (let i = 0; i < arr.length; i++) {
setTimeout(function() {
   console.log(arr[i]) 
}, 1000);
} // Prints all the values correctly
Run Code Online (Sandbox Code Playgroud)

Sre*_*noy 1

首先,输出将是四次而不是五次(如您的评论中所述)。我将你的代码粘贴到 Babel REPL 中,这就是我得到的,

"use strict";

var arr = [1, 2, 3, 4];

var _loop = function _loop(i) {
setTimeout(function () {
   console.log(arr[i]);
}, 1000);
};

for (var i = 0; i < arr.length; i++) {
_loop(i);
}
Run Code Online (Sandbox Code Playgroud)

现在你明白 let 内部是如何工作的了吗?:-)