饥人谷技术博客

关于Function.prototype.call.apply的

2018-05-19  本文已影响0人  恰逢青雪

我在阅读《JavaScript设计模式与开发实践》一书时发现一段有趣的代码,他是函数反柯里化uncurry的一种实现方法

uncurrying 函数

var obj = {
    "length":1,
    "0":1
}
Function.prototype.uncurrying = function() {
    var self = this;
    return function() {
        return Function.prototype.call.apply(self, arguments);
}
}

var push = Array.prototype.push.uncurrying()

push(obj, 2) //{0: 1, 1: 2, length: 2}

可以看到最终执行Array.prototype.push方法的对象是我们传入的obj对象 它成功的通过一个uncurrying后的push方法借用了Array.prototype.push这方法将2新增进来,下面进行重要语句解析

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

举个栗子:

我们平时借用Math.Max时求数组中最大值是这样的
Math.Max.apply([], [1,2,3])

call也是一样的道理:

之所以要和大家讲这个例子是想说明先调用apply再调用排在apply之前的函数max

这次主角也不例外

过程解析:

Function.prototype.call.apply(Array.prototype.push, [obj, 2])

apply替换执行函数的对象并扁平化了数组内容,

Array.prototype.push.call(obj, 2)

call函数将数组内容的第一个参数替换执行函数对象

obj.push(2)

结果便是

{0: 1, 1: 2, length: 2}

上一篇下一篇

猜你喜欢

热点阅读