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

Javascript加法器列表中的变量提升,javascript,scope,hoisting,Javascript,Scope,Hoisting,我已经学习了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,

我已经学习了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));
})
函数生成加法器(lst){
var-ar=[];
对于(变量i=0;ix+n;
}
返回ar;
}
var加法器=makeadder([6,3,5]);
加法器。forEach((加法器)=>{
控制台日志(加法器(100));
})
这段代码首先从给定的列表创建一个函数数组。每个函数将相同的传递数(在本例中为100)添加到列表的特定值并打印结果。它的预期输出是:106103105,如果在for循环中使用“let”而不是“var”,则可以实现这一点。然而,上面代码的输出是105、105、105,经过一些研究,我得出结论,这是因为变量I和n被提升(因为var被提升而let没有)


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

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

let
无法提升,被劫持(仅限于范围)到最近的方括号
{
..
}

代码具有提升的
n
(不是提升到
{…for…}内的for作用域
),而是提升到
makeAdders
功能的作用域 现在当代码

var adders = makeAdders([6,3,5]);
执行时,我们有一个加法器数组
函数
s,所有加法器对共享的
n
变量都有
闭包
closure
是指函数可以访问其词法作用域,即使它完全在另一个作用域中执行) 当所有
函数
s共享
n
时,最后一个
n
被设置为输入数组
中最后一个元素的值,该值目前恰好为5

这就是为什么在创建所有函数后,
n
5
,所有
加法器将返回
5+x

谢谢。那么吊装的意外后果是变量n成为闭合的一部分?这现在是有意义的。更具体地说,它不是成为closue的一部分,而是,
n保存在makeAdders作用域和返回的函数数组中,每个函数都有一个
closue
(我喜欢称之为链接)到
makeAdders
的作用域,这样它就可以成功访问
n
。你可以随时准备,这很有帮助