call(apply)邊邊站,bind函數纔好看

爲何忽然想說bind函數,仍是要多虧了上週二的三次面試。提及面試我可能就要多話幾句,其實面試也是一個至關消耗體力與腦力的運動。因此面試前睡個好覺,吃頓飽餐,能夠說是成功了一半。還有一半可能就要靠你平時的積累與發揮。css

在上週的面試中,每次面試官都有提到bind函數,萬萬沒想到,bind函數的出現率竟然如此高!html

我雖知道bind函數的用法可是並無細緻的去研究和揣摩過bind函數。因此...react

雖然說技術面中一道題不會致你餘死地,但也會下降你在技術領域高大而宏偉的形象,面試官或許會在心中暗想這娃不行。git

本文我主要根據面試時候遇到的題目,總結爲如下2個問題github

1.bind和apply(call)最根本的區別是什麼面試

2.在ES5以前手寫實現bind函數bash

若是小夥伴早知熟知這兩個問題,能夠瀏覽下一朋友正在籌劃中的 面試彙總庫app

閒事少管,走路陳展。開始正題。函數

1.bind和apply(call)最根本的區別是什麼


我相信大多數朋友都深入的知道call,apply是參數列表的不一樣。但今天重點是說明ui

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;
}

複製代碼

若是個人文章對你有幫助,我也但願可以獲得你的鼓勵,由於你的鼓勵是我前進的動力。

相關文章
相關標籤/搜索