将javascript函数作为数组方法调用

时间:2012-08-06 20:51:47

标签: javascript

更新:我知道有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”函数的上下文将是调用它的对象,在本例中为“list”。

当这段代码运行时,我得到错误:“未捕获的TypeError:对象一,二,三没有方法'forEach'”。

这是什么我不理解?

谢谢!

5 个答案:

答案 0 :(得分: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);
    }
);​

您似乎正在尝试在该列表对象上创建自己的对象。如果是这样,你需要使它成为该对象的属性。

答案 1 :(得分:0)

您可以使用this keyword

设置上下文对象(call
myForEach.call(list, function(index) { … });

另一种可能性是调用列表对象的函数as a property

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

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

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

注意:数组上应该已经存在forEach method。从古代浏览器那里使用兼容垫片来提供完全相同的功能。

答案 2 :(得分:0)

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

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

答案 3 :(得分: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);
});

* NB 以避免与现有forEach函数冲突(https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/forEach)我已将函数命名为{{1我期望从冲突中获得安全。

答案 4 :(得分: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 */ };