Array.prototype.for每个本机实现问题



我正在尝试实现本机的每种方法。这是我的代码:

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);
});

问题:

如果我删除 let a = [1,2,3,4,5],则执行 [1,2,3,4].forEach 失败。

我不明白为什么。

在 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,因此这是未定义的,尝试在未定义时调用myEach会出错。

原来的工作是因为中间 let 语句实现了分离(感谢分号但与实际的let a =语句无关)。

最新更新