Javascript 需要帮助理解JS代码吗
您好,我是javascript新手,无法理解以下代码:Javascript 需要帮助理解JS代码吗,javascript,closures,Javascript,Closures,您好,我是javascript新手,无法理解以下代码: var createAdders = function () { var fns = []; for (var i = 1; i < 4; i++) { fns[i] = (function (n) { return i + n; }); } return fns; } var adders = createAdders(); adders[
var createAdders = function () {
var fns = [];
for (var i = 1; i < 4; i++) {
fns[i] = (function (n) {
return i + n;
});
}
return fns;
}
var adders = createAdders();
adders[1](7); //11 ??
adders[2](7); //11 ??
adders[3](7); //11 ??
这里是否也应用了相同的逻辑?
我需要了解n是如何分配值7的
为什么在新代码的函数末尾使用(i)?在第一个块中,
createAdders()
返回一个函数数组,每个函数(在createAdders()
函数体的内部循环中创建)求和参数n
(7值)对于在循环中创建的变量i
,在循环的末尾,wich的值为4(这解释了11)
调用adders[1](7)
时,返回存储在数组fns
位置1的函数,然后使用参数n=7
调用函数,然后函数继续将此参数与createAdders
函数的i
变量求和(此时的值是4
调用加法器[1](7)
)在JavaScript中,我们没有块作用域,只有函数作用域
在第一个示例中,声明的唯一i
属于createAdders
范围,这意味着在for
循环中创建的所有函数将在范围链中查找相同的i
并返回相同的值。用代码说明:
// here's the only `i` declaration
for (var i = 1; i < 4; i++) {
fns[i] = (function (n) {
return i + n; //this line will retrieve the `i` variable declared above,
//that being always 4 after the loop ends
});
}
当您调用在IIFE内部创建的函数时,范围链将检索“最近的”i
在作用域链中,它是创建函数的IIFE的形式参数i
。在javascript中,内部函数始终可以访问其外部函数变量,即使外部函数完成执行。这种行为称为闭包
在第一个代码段中,您迭代了3次,并将函数推送到数组中。当循环完成执行变量i时,将设置为4。并且您推送到数组中的函数可以访问该变量。因此,无论您在数组的哪个索引处执行函数,您总是得到11(4+7)
在第二个代码段中,您正在使用一个自动执行的匿名函数来保存i的值。此匿名函数在每次交互时都会立即执行。因为此匿名函数中定义的闭包函数每次都引用新的i值
数组中有三个函数,每个函数的独立值为i(1,2,3)
按如下方式编写第二个代码片段使其更加清晰
var createAdders = function(){
var fns = [ ];
for (var i=1; i<4; i++) {
(function(a) {
fns[a] = (function(n) {
return a+n;
});
})(i)
}
return fns;}
可细分如下
var fn = adders[1];
fn(7); //thats how n is set to 7
我是JS的中级,我也不明白“n”是什么(=)n
是调用函数时传递的参数。这是一个很好的解读:请停止编辑。我正在努力读书(试图使其更易于阅读。:P
自执行与立即调用不同。自执行与递归相关联,递归是一个调用自身的函数,就像在函数foo(){foo();}
中一样,同时是一个IIFE(立即调用的函数表达式)这是它所说的,一个立即被调用的函数表达式:(function(i){})(i)
以及(function(i){}(i))
。这是一个很小的错误信息,但许多人也有这样一个错误信息,称iife为自执行的——它们不是,除非它在(function foo(i){foo(i+1);}(i))中调用自己
-,这是一件值得一提的事情。谢谢,我还以为它们的意思是一样的呢
var createAdders = function(){
var fns = [ ];
for (var i=1; i<4; i++) {
(function(a) {
fns[a] = (function(n) {
return a+n;
});
})(i)
}
return fns;}
adders[1](7);
var fn = adders[1];
fn(7); //thats how n is set to 7