Javascript 需要帮助理解JS代码吗

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[

您好,我是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[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