Array.prototype.map = function(f/*,thisP*/){
var len = this.length;
var results = new Array(len);
var thisP = arguments[1];
for(var i=0 ;i<len;i++){
results[i] = f.call(thisP,this[i],i,this); }
return results;
}
var a=[1,4,9];
var res = a.map(Math.sqrt);
alert(res.join());
这里这个thisP 到底是什么?
我认为这是个undefined 它怎么成了对象了?
var len = this.length;
var results = new Array(len);
var thisP = arguments[1];
alert(thisP); // undefined
for(var i=0 ;i<len;i++){
results[i] = f.call(thisP,this[i],i,this)
}
return results;
}
var a=[1,4,9];
var res = a.map(Math.sqrt);
alert(res.join()); // 1, 2, 3call 方法
调用一个对象的一个方法,以另一个对象替换当前对象。call([thisObj[,arg1[, arg2[, [,.argN]]]]])参数
thisObj可选项。将被用作当前对象的对象。arg1, arg2, , argN可选项。将被传递方法参数序列。说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
当你不传时它就是 undefined
为什么不直接写thisP = undefined;或者写thisP = {};2. f.call(thisP,this[i],i,this) 这里的 i 和 this 参数根本没用用到啊?为什么要加这两个参数?
你可以先看看arguments这个东东
当你的map方法传递一个参数,arguments[1]没有值就是undefined
当你的map方法传递2个或更多那么arguments[1]就取到值了
arguments就是参数数组
而 var thisP = arguments[1]; 似乎是后加上去的,
以保证代码可以运行。
完全可以这么写:
Array.prototype.map = function(f){
var len = this.length;
var results = new Array(len);
for(var i=0 ;i<len;i++){
results[i] = f.call(undefined,this[i],i,this)
}
return results;
}
答2:f.call(thisP,this[i],i,this) 这里的 i 和 this 参数应该是原来与 thisP 有关的参数,
当 f 为 Math.sqrt 时确实用不到,因为 Math.sqrt 只需要一个参数,
如果只传入单一参数的方法,那么后两个参数应该及时删除。最终代码如下:
Array.prototype.map = function(f){
var len = this.length;
var results = new Array(len);
for(var i=0 ;i<len;i++){
results[i] = f.call(undefined,this[i])
}
return results;
}