关于Function.prototype.call.apply的分析

227 阅读1分钟

起因是在看《javascript设计模式与开发实践》这本书时,遇到了这样一段实现反柯里化的代码

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

~~~~~~看到这段代码之前,还了解了以下知识~~~~~~

1. 什么是反柯里化

当我们调用对象的某个方法时,其实不用去关心该对象原本是否被设计为拥有这个方法 例如:Array.prototype上的方法,也可以被其他类型对象调用;像这种扩大适用范围,使本来只有特定对象适用的方法也可以被其他对象适用的函数叫做反柯里化。

2. 实现反柯里化的核心代码

    Function.prototype.call.apply(self, arguments)

~~~~~~来个实例吧,我一般都是先看结果再分析过程的~~~~~~

var push = Array.prototype.push.uncurrying(); 
var obj = { 
 "length": 1, 
 "0": 1 
}; 
push( obj, 2 ); 
console.log( obj ); // 输出:{0: 1, 1: 2, length: 2}

分解步骤

  1. 先执行apply(Array.prototype.push, [obj, 2]),首先改变this的指向,然后[将obj,2]铺平(至于为啥是铺平呢,我就又学习了3),
  2. 于是变成了 Array.prototype.push.call(obj, 2);
  3. 最终 转换为obj.push(2);