Array.prototype.forEach本机实现问题

时间:2018-03-23 04:40:42

标签: javascript arrays

我正在尝试实现原生的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失败。

我无法理解为什么。

1 个答案:

答案 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 =语句无关)。