Function.prototype.unCurrying = function () { var self = this; return function () { //[].slice.call(arguments,1)===Array.prototype.push.slice.call(arguments,1)===arguments.slice(1) return self.apply(arguments[0], [].slice.call(arguments, 1)); }; }; var push = Array.prototype.push.uncurrying() console.log(push); push(obj,2) //{0: 1, 1: 2, length: 2} console.log(obj);
分析一下:
1、首先在Function原型对象上添加uncurrying方法,这样所有的Function都可以借用;
2、返回一个闭包内部函数
3、闭包函数返回的结果中返回的是调用方法,self指向Array.prototype.push,apply方法中第一个参数是更改指向,对应下面push(obj,2)相当于更改指向为obj.push(2)
4、apply方法中第二个参数的call方法是更改指向为arguments,并且arguments中能使用slice方法,等于arguments.slice(1)