更新:我知道有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'”。
这是什么我不理解?
谢谢!
答案 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 */ };