Javascript 添加器列表中的变量提升

Variable Hoisting in Javascript List of Adders

我在 JavaScript 中学习了变量提升的基础知识,现在正尝试通过做一些练习来增强它。我遇到过这段代码:

function makeAdders(lst) {
    var ar = [];
    for(var i = 0; i < lst.length; i ++) {
        var n = lst[i];
        ar[i] = (x) => x + n;
   }
   return ar;
}

var adders = makeAdders([6,3,5]);

adders.forEach((adder) => {
    console.log(adder(100));
})

此代码首先从给定列表中创建一个函数数组。每个函数将相同的传递数字(在本例中为 100)添加到列表的特定值并打印结果。其预期输出为:106、103、105,如果在 for 循环中使用“let”而不是“var”,则可以实现此目的。上面代码的输出是 105、105、105,经过一些研究,我得出的结论是,这是因为变量 i 和 n 被提升了(因为 var 被提升而 let 没有)。

但是,我不能完全理解这里到底发生了什么,以及这段代码中的变量提升是如何阻止它实现预期结果的。有人可以帮我了解这里到底发生了什么吗?提前致谢!

var 提升基于 file(如果变量在全局范围内)或 function(如果变量在函数内部)

let 不会提升并被劫持(仅限范围)到最近的大括号 { ... }

代码有 n 被提升(不是 {...body of for...} 内的 for 范围)而是 makeAdders 函数的范围 现在当代码

var adders = makeAdders([6,3,5]);

被执行我们有一个加法器数组 function,所有加法器都有 closure 到一个共享的 n 变量 (closure 是指函数可以访问其词法范围,即使它是在完全另一个范围内执行的) 虽然 n 在所有 function 之间共享,但最后一个 n 设置为输入数组 which happened to be 5 for now 中最后一个元素的值 这就是为什么在创建所有函数后 n5 而所有 adders 将 return 5 + x