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
中最后一个元素的值
这就是为什么在创建所有函数后 n
有 5
而所有 adders
将 return 5 + x
我在 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
中最后一个元素的值
这就是为什么在创建所有函数后 n
有 5
而所有 adders
将 return 5 + x