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]。
【完】
一切皆为虚幻