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 它怎么成了对象了?

解决方案 »

  1.   

    thisP 就是 undefined!   Array.prototype.map = function(f/*,thisP*/){
            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。
      

  2.   

    你可以传一个 对象 作为this
    当你不传时它就是 undefined 
      

  3.   

    To yixianggao:1. 既然thisP 就是 undefined!
    为什么不直接写thisP = undefined;或者写thisP = {};2. f.call(thisP,this[i],i,this) 这里的 i 和 this 参数根本没用用到啊?为什么要加这两个参数?
      

  4.   


    你可以先看看arguments这个东东
    当你的map方法传递一个参数,arguments[1]没有值就是undefined
    当你的map方法传递2个或更多那么arguments[1]就取到值了
    arguments就是参数数组
      

  5.   

    答1:thisP 原来应该是传入参数,现在被注释掉了,
    而 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;
       }