0

更新:我知道有 forEach 方法的现有实现。这样做的目的是学习和提高我的 Javascript 技能。

我正在尝试为数组对象实现一个 forEach 方法。我正在做的是以下内容:

var list = ['one', 'two', 'three'];

function forEach(callback){
    for(var n = 0; n < this.length; n++){
        callback.call(this[n], n);
    }
};

list.forEach(function(index){
        console.log(index);
        console.log(this);
    }
);

我对javascript不是很好,我正在努力变得更好,所以我读了一点,现在我知道如果我做这种事情,“forEach”函数的上下文将是对象调用它,在本例中为“列表”。

当此代码运行时,我收到错误消息:“未捕获的 TypeError:对象一、二、三没有方法 'forEach'”。

我不明白的是什么?

谢谢!

4

5 回答 5

1
var list = ['one', 'two', 'three'];

list.forEach = function(callback){
    for(var n = 0; n < this.length; n++){
        callback.call(this[n], n);
    }
};

list.forEach(function(index){
        console.log(index);
        console.log(this);
    }
);​

看来您正试图在该列表对象上创建自己的对象。如果是这样,您需要使其成为该对象的属性。

于 2012-08-06T20:54:19.570 回答
0

您可以使用以下方法设置上下文对象(this关键字call

myForEach.call(list, function(index) { … });

另一种可能性是将函数作为列表对象的属性调用:

list.myForEach = function(callback) { … };
list.myForEach(function(index) { … });

或者通过将其添加到所有Array对象的原型中来启用它:

Array.prototype.myForEach = function(callback) { … };
['one', 'two', 'three'].myForEach(function(index) { … });

注意:数组上应该已经有一个forEach方法。从那里为古老的浏览器使用兼容性垫片来提供完全相同的功能。

于 2012-08-06T20:57:41.807 回答
0

我相信您需要在实例化数组之前定义 forEach。

Array.prototype.forEach = function (callback) {
    var n;
    for(n = 0; n < this.length; n++){
        callback.call(this[n], n);
    }
};
于 2012-08-06T20:59:44.243 回答
0

我认为您想要做的可能不是将 foreach 函数仅附加到您在这里拥有的一个数组上,而是使其适用于所有数组。为此,您必须编辑 Array 原型(有些人对此有非常强烈的看法,因为您无法防止未来潜在的命名空间冲突 - 但其他人发现它非常有用)。一旦Array.prototype对象添加了一个函数,您就可以在任何数组上调用该函数。像这样:

var list = ['one', 'two', 'three'];

Array.prototype.myForEach = function(callback){
    for(var n = 0; n < this.length; n++){
        callback.call(this[n], n);
    }
};

list.myForEach(function(index){
    console.log(index);
    console.log(this);
});

*注意避免与现有的 forEach 函数发生冲突 (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach) 我已经命名了myForEach我希望避免冲突的函数。

于 2012-08-06T21:01:18.110 回答
0

您需要将 forEach 方法添加到 Arrays 的原型中:

/*
* pay attention to the fact that if you use forEach aas method name you'll override
* the built default forEach method, try to use some prefix to distinguish between
* the built in methods and your own ones 
*/
Array.prototype.my_forEach = function(callback){ /* your code here */ };
于 2012-08-06T21:02:34.963 回答