美文网首页饥人谷技术博客
关于Function.prototype.call.apply的

关于Function.prototype.call.apply的

作者: 恰逢青雪 | 来源:发表于2018-05-19 03:48 被阅读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])

  • 先执行apply将Math替换为[]
  • 然后再执行Max并传入[1,2,3] 因为apply的关系 参数[1,2,3]已经扁平化成1,2,3
  • 所以相当于[].Max(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}

相关文章

  • 关于Function.prototype.call.apply的

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

  • 关于Function.prototype.call.apply(

    在函数反柯里化的通用实现中有一种通用实现,代码如下: 在一篇文章中看到这样一句话:如果使用apply(null, ...

  • 关于关于的关于

    关于这篇文章究竟该起个什么名字,想了很长时间也没答案,于是只能暂且搁置,等到写完之后再说。其实不仅是文章的名字,就...

  • 关于的关于

    今天又重新思考了笑来老师的《通往财富自由之路》中的《你拥有的最宝贵的财富》——注意力。其中,讲到典型的隐形大...

  • 关于的关于的未来

    (一) 周五加了会班,檀姐问我的打算是什么?我愣了一下,没有太明确的说什么,只道“先这样,走一步看一步吧。”心里却...

  • 关于他的关于

    我不知道该写些什么,我只知道如果我再不写点什么,大概就会疯掉了。 关于小Q 妈妈叫他小混世魔王,爸爸...

  • 关于我的关于

    六月到,云是软的,风是轻的,怀揣期待六月的海浪的兴致,和一颗继续热爱世界的心。 我都快要忘记当初下载简书的原因,...

  • 关于所有关于电影的关于

    这个专题,浪荡儿的电影世界,名字来自意大利电影导演的一部电影《浪荡儿》。 这个专题收录一些比较严肃的电影评论,可以...

  • 关于过去的,关于未来的

    许久没动笔了,好像墨水在三尺冰寒下慢慢向大海深处散去,最后丝丝缕缕,都缠绕在别人的心上。 过去一年里,主题就是旅程...

  • 关于不知所为的关于

    我们为什么会动心? 因为美貌,因为人品,因为相濡以沫,因为日久生情 我不明是否种种能囊括一切的情不知所起,但能笃定...

网友评论

    本文标题:关于Function.prototype.call.apply的

    本文链接:https://www.haomeiwen.com/subject/rlfodftx.html