call(apply)边边站,bind函数才好看

502 阅读2分钟

为什么突然想说bind函数,还是要多亏了上周二的三次面试。说起面试我可能就要多话几句,其实面试也是一个相当消耗体力与脑力的运动。所以面试前睡个好觉,吃顿饱餐,可以说是成功了一半。还有一半可能就要靠你平时的积累与发挥。

在上周的面试中,每次面试官都有提到bind函数,万万没想到,bind函数的出现率居然如此高!

我虽知道bind函数的用法但是并没有细致的去研究和揣摩过bind函数。所以...

虽说技术面中一道题不会致你余死地,但也会降低你在技术领域高大而宏伟的形象,面试官或许会在心中暗想这娃不行。

本文我主要根据面试时候遇到的题目,总结为以下2个问题

1.bind和apply(call)最根本的区别是什么

2.在ES5之前手写实现bind函数

如果小伙伴早知熟知这两个问题,可以浏览下一朋友正在筹划中的 面试汇总库

闲事少管,走路陈展。开始正题。

1.bind和apply(call)最根本的区别是什么


我相信大多数朋友都深刻的知道call,apply是参数列表的不同。但今天重点是说明

bind()方法创建一个新的函数,在调用时设置this关键字为提供的值

apply() 方法调用一个具有给定this值的函数

关键在于bind函数创建了一个新的函数并且这个新的函数执行上下文不会再变

一位码农是一个函数,他的女票就是他的对象

情比金坚,至死不渝的码农 = 码农.bind(对象)

而使用apply,call更像是我今天喜欢你,明天喜欢他,后天隔壁家的王喇叭,但是基本上是单相思对方都不同意,所以都没能产生结果。

2.在ES5之前手写实现bind函数

// 面试中回答的方法,也是mdn文档提供的方法

Function.prototype.bind2 = function (context) {

    if (typeof this !== "function") {
      throw new Error("Function.prototype.bind - what is trying to be bound is not callable");
    }

    var self = this;
    var args = Array.prototype.slice.call(arguments, 1);

    var fNOP = function () {};

    var fBound = function () {
        var bindArgs = Array.prototype.slice.call(arguments);
        return self.apply(this instanceof fNOP ? this : context, args.concat(bindArgs));
    }

    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();
    return fBound;
}

如果我的文章对你有帮助,我也希望能够得到你的鼓励,因为你的鼓励是我前进的动力。