Javascript加法器列表中的变量提升
我已经学习了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,
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
。你可以随时准备,这很有帮助