我正在尝试实现原生的forEach方法。这是我的代码:
Array.prototype.myEach = function(cb) {
for(let i=0; i<this.length; i++) {
cb(this[i], i)
}
}
如果我声明let a = []
(某物),然后运行[].myEach
,那就可以了。
let a = [1,2,3,4,5]; // or even []
[1,2,3,4,5].myEach(function(val, i){
console.log(val); //works
});
但是如果我没有在顶部声明数组,它甚至不会识别原型。
[1,2,3,4,5].myEach(function(val, i){ //fails
console.log(val);
});
问题:
如果我删除了a = [1,2,3,4,5],则执行[1,2,3,4] .forEach失败。
我无法理解为什么。
答案 0 :(得分:4)
在myEach函数后包含一个分号:
Array.prototype.myEach = function(cb) {
for(let i=0; i<this.length; i++) {
cb(this[i], i)
}
};
[1,2,3,4,5].myEach(function(val, i){
console.log(val);
});
如果没有分号,这就解析如下:
Array.prototype.myEach = function(cb) {
for(let i=0; i<this.length; i++) {
cb(this[i], i)
}
}[1,2,3,4,5].myEach( ....etc
和[1,2,3,4,5]
尝试从函数(对象)获取属性5
- 就像您编写了function(){}[5]
一样。没有属性5
所以这是未定义的并且尝试在undefined上调用myEach会产生错误。
原作是因为中间let语句实现了分离(感谢分号,但与实际的let a =
语句无关)。