如何从匿名函数次循环中的for循环? [重复](How to get current loop

2019-09-28 16:52发布

可能重复:
JavaScript的闭包内环路-简单实用的例子

我有一个与内部的匿名函数循环,并且在功能我想访问本次循环。 但由于某些原因,而不是循环迭代,我得到4.唯一的其他地方4的值是myArray.length。 如果我通过我作为一个参数,我得到的翻译:出去。 我究竟做错了什么? 我的代码:

var width = function(){
   for(var i = 0, len = myArray.length; i < len; ++i){
      alert(i) //this outputs the current iteration
      myArray[i].load(function(){
         alert(i) //this outputs 4 (or [object Object])
      });
   };
};

谢谢。

Answer 1:

传递给您的匿名函数.load正在执行的方式你的循环结束后。

你必须创建一个本地范围,并复制i的变量:

var width = function(){
    for(var i = 0, len = myArray.length; i < len; ++i){
        (function(i){
            myArray[i].load(function(){
                alert(i) //this outputs 4 (or [object Object])
            });
        })(i);
    };
};


Answer 2:

ECMAScript 5包括bind() ,它是用来获得与一个函数this绑定到它的值,以及参数值。

function loader( i ){
    alert( i );
}

var width = function(){
   for(var i = 0, len = myArray.length; i < len; ++i){
      alert( i );
      myArray[i].load( loader.bind( null, i )  );
   }
};

在这里,我结合nullthis在函数返回值,但可以将其设置为别的东西。 然后我绑定的当前值i作为第一个参数。


要获得旧的浏览器(如果需要)的支持,包括垫片从MDN :

if (!Function.prototype.bind) {
    Function.prototype.bind = function (oThis) {
        if (typeof this !== "function") // closest thing possible to the ECMAScript 5 internal IsCallable function
        throw new TypeError("Function.prototype.bind - what is trying to be fBound is not callable");
        var aArgs = Array.prototype.slice.call(arguments, 1),
            fToBind = this,
            fNOP = function () {},
            fBound = function () {
                return fToBind.apply(this instanceof fNOP ? this : oThis || window, aArgs.concat(Array.prototype.slice.call(arguments)));
            };
        fNOP.prototype = this.prototype;
        fBound.prototype = new fNOP();
        return fBound;
    };
}

这是一个基本兼容垫片,它会为大多数情况下工作。



文章来源: How to get current loop iteration from anonymous function within the for loop? [duplicate]