Function.prototype.call.apply()方法

在看uncurrying化函数时候,碰到了Function.prototype.call.apply()的用法:

先说说uncurrying()函数:

Function.prototype.uncurrying = function(){
   var self = this;
   return function(){
       var obj = Array.prototype.shift.call(arguments);
       return self.apply(obj,arguments);
   }
}

然后可以通过var call = Function.prototype.call.uncurrying()进行函数参数的调用:

var call = Function.prototype.call.uncurrying();
var fn = function(name){
    console.log(name);
}
call(fn,window,'sven');

最后输出的是://sven

怎么解释这段代码呢?

Function.prototype.call.apply(fn,[window,'sven']);
Function.prototype.call.call(fn,window,'sven');
fn.functionCall(window,'sven');  
window.fn('sven'); //'sven

可以先将apply的调用转化为call的调用方式,而后改变this指向,fn拥有call的方法,再window拥有fn的方法,参数'sven'输入进去,最后输出sven。

 再看下Function.prototype.apply.apply()方法的调用:

var apply = Function.prototype.apply.uncurrying();
var fn = function(name){
    console.log(this.name);  //sven
    console.log(arguments);  //[1,2,3]
}
apply(fn,{name:'sven'},[1,2,3]);

Function.prototype.apply.apply(fn,[{name:'sven'},[1,2,3]]);
Function.prototype.apply.call(fn,{name:'sven'},[1,2,3]);
fn.FunctionApply({name:'sven'},[1,2,3]);

最后转化时候,this对象指向{name:'sven'},arguments此时是[1,2,3]。

【完】

一切皆为虚幻

原文地址:https://www.cnblogs.com/tangjiao/p/9914266.html