关于手动实现Array.prototype.myMap的参数传递与调用疑问
手动实现
Array.prototype.myMap代码疑问解答 先贴出对应的代码:
// The global variable const s = [23, 65, 98, 5]; Array.prototype.myMap = function(callback) { const newArray = []; // Only change code below this line for(let i = 0; i < this.length; i++){ newArray.push(callback(this[i])); } // Only change code above this line return newArray; }; const new_s = s.myMap(function(item) { return item * 2; }); console.log(new_s);
问题1解答
- 第4行的
callback参数不是没传值,而是在第17行调用s.myMap()时,把function(item) { return item * 2; }这个函数传进去了,它就是callback。 callback不需要知道整个数组,它只需要处理单个元素。myMap方法内部的this,在s.myMap()调用时指向数组s——这是JavaScript方法调用的规则:用对象.方法()形式调用时,方法内部的this指向该对象。- 第9行里,
this[i]从数组s中取出第i个元素,再把这个元素作为参数传给callback,所以callback能拿到当前要处理的数组元素。简单说,数组通过this进入myMap方法,再通过this[i]提取元素传给callback。
问题2解答
s.myMap是我们实现的工具方法,它的核心功能是“遍历数组,对每个元素执行你指定的操作,最后返回新数组”——这里的“指定操作”就是必须传入的callback函数。如果直接调用s.myMap()不传参数,callback会是undefined,第9行执行callback(this[i])时会报错,因为undefined无法作为函数调用。- 第17行的
item,就是myMap方法里传给callback的this[i],也就是数组s里的每一个元素。比如第一次遍历item是23,第二次是65,这个参数名可以随便修改(比如改成num或element),它只是用来接收当前遍历到的数组元素的变量名。
内容的提问来源于stack exchange,提问作者Sheroze Mohammed
相关产品推荐
相关产品推荐

