关闭JavaScript的立即评估[复制](javascript closure immediate

2019-07-17 19:04发布

这个问题已经在这里有一个答案:

  • JavaScript的闭包内环路-简单实用的例子 43个回答

请看下面的Javascript代码:

var a = [];

var f = function() {

    for (var i = 0; i < 3; i++) {
        a.push(function(){alert(i)});
    }
    for (var j = 0; j < 3; j++) {
        a[j]();
    }
};

警报打印出“3”的所有三次。 我想不同的行为 - 在每次循环生成打印i的当前值的函数。 即3个功能打印不同的指数。

有任何想法吗?

Answer 1:

创建它接受一个匿名函数i作为参数并返回该特定功能:

for (var i = 0; i < 3; i++) {
    a.push((function(i) {
        return function() {
            alert(i);
        }
    })(i));
}

for (var j = 0; j < 3; j++) {
    a[j]();
}

或者做类似的事情:创建,它接受一个匿名函数i作为参数传递给函数添加到阵列中:

for (var i = 0; i < 3; i++) {
    (function(i) {
        a.push(function() {
            alert(i);
        });
    })(i);
}

for (var j = 0; j < 3; j++) {
    a[j]();
}


Answer 2:

只是另一种方法,使用钻营 :

var a = [];
var f = function() {
    for (var i = 0; i < 3; i++) {
        a.push((function(a){alert(a);}).curry(i));
    }
    for (var j = 0; j < 3; j++) {
        a[j]();
    }
};

// curry implementation
Function.prototype.curry = function() {
  var fn = this, args = Array.prototype.slice.call(arguments);
  return function() {
    return fn.apply(this, args.concat(
      Array.prototype.slice.call(arguments)));
  };
};

检查上面的代码运行在这里 。



Answer 3:

var iterate = (function () {
    var i, j = [];
    for (i = 0; i < 3; i += 1) {
        j.push(i);
        alert(j[j.length - 1]);
    }
}());

您不必封仅仅输出值。 您的代码应该,但是,包含在面向对象的遏制功能。 函数没有被调用执行。



Answer 4:

你可以把你的循环体中的匿名函数:

var a = [];

for(var i = 0; i < 3; i++) (function(i) {
    a.push(function() { alert(i); });
})(i)

for(var j = 0; j < 3; j++) {
    a[j]();
}

通过创建函数并传递的环路的值“i”作为参数,我们正在创建的循环体内部的一个新的“我”的变量,基本上是隐藏外的“i”。 你推到阵列上的封闭件现在看到的新的变量,其值的当外函数函数被调用在第一回路被设置。 如果我们使用不同的名称,当我们创造了新的变量,这可能是更清楚...这做同样的事情:

var a = [];

for(var i = 0; i < 3; i++) (function(iNew) {
    a.push(function() { alert(iNew); });
})(i)

for(var j = 0; j < 3; j++) {
    a[j]();
}

因为该函数是由循环立即称为“INEW”的值被分配为0,则1,则2。



Answer 5:

这将工作,如果a.push(函数(I){警报(我)}); 来代替a.push(函数(){警报(ⅰ)}); –  T.马克尔 1月18日在'14 15:13



文章来源: javascript closure immediate evaluation [duplicate]