美文网首页
关于Function.prototype.call.apply(

关于Function.prototype.call.apply(

作者: 灯光树影 | 来源:发表于2018-09-02 20:02 被阅读0次

在函数反柯里化的通用实现中有一种通用实现,代码如下:

/**
   函数反柯里化
   @return {function} 处理后的函数  
*/
function uncurring(){
    var that = this;
    return function(){
        return Function.prototype.call.apply(that, arguments);
    }
} 

一篇文章中看到这样一句话:
如果使用apply(null, arguments),因为null对象没有call方法,会报错。
于是,尝试了一下将代码中的that改成null,发现真的报错:
Uncaught TypeError: Function.prototype.call.apply is not a function。
这里说Function.prototype.call.apply不是一个函数。这让我很疑惑,apply不是让window可以“借用”call方法了吗?为什么还需要window对象本身有call方法?

最后在我的理解中,它的过程应该是这样的:
apply先把Function.prototype.call方法的上下文(作用域)改成了that,再调用call相当于:

// fn是调用uncurring函数的函数
function fn(){
    // 把call放到fn的内部作用域中
    var call = function(){
        // native code
    }
    // 调用call方法
    call(arguments[0], arguments[1], ..., arguments[n]);
}   

由于调用call的this被改变成that(即fn),相当于:
apply改变的this其实是改变了调用call的对象

fn.call(arguments[0], arguments[1], ..., arguments[n]);

然后才在调用call后改变fn的上下文,最后相当于:

arguments[0].fn(arguments[1], ..., arguments[n]);

如果把反柯里化函数中的apply(that)改成apply(null)就相当于存在这样的调用:

window.call(arguments[0], arguments[1], ..., arguments[n]);

而window本身并没有call方法,所以报错。

相关文章

  • 关于Function.prototype.call.apply(

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

  • 关于Function.prototype.call.apply的

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

  • 关于关于关于

    他们爱他们自己,不爱你 他们爱你是他们的母亲妻子女儿姐妹 他们不爱你 直到你死的时候,爱才产生,与遗忘同时 那也不...

  • 光明人生

    关于出生 关于成长 关于求学 关于青春期 关于恋爱 关于择业 关于婚姻 关于养生 关于家庭 关于人际 关于教子 关...

  • 「梦雅的简动力」打卡计时65天

    * 关于人生 * 关于梦想 * 关于方向 * 关于创业 * 关于投资 * 关于成败 * 关于个性 * 关于高度 *...

  • 关于

    关于两个人? 关于100步? 关于回头? 关于深情? 关于家庭? 关于孩子? 关于成长? 关于伤痛? 关于怀抱? ...

  • 2017新手妈妈年终总结

    关于购物 关于体重 关于减肥 关于纪念日 关于生活态度 关于上班 关于职场晋升加薪 关于睡眠 关于抱孩子 关于发型...

  • 2018-11-28

    关于流浪、关于随心、关于自由、关于世俗、关于规则、关于坦诚、关于真我、关于好奇心、关于对这整个世界的态度、关于整个...

  • 一首歌的时间

    认真的 想理出点思绪 关于今天关于明天 关于工作关于梦想 关于冬天关于夜晚 关于阳光关于浪花 关于木马关于窗花 关...

  • 最近的各种关于

    关于运动,关于中文阅读,关于英文听力,关于口算。 关于专注,关于目标,关于举家迁移。 关于对正确的过于执着,关于对...

网友评论

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

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