爲何忽然想說bind函數,仍是要多虧了上週二的三次面試。提及面試我可能就要多話幾句,其實面試也是一個至關消耗體力與腦力的運動。因此面試前睡個好覺,吃頓飽餐,能夠說是成功了一半。還有一半可能就要靠你平時的積累與發揮。css
在上週的面試中,每次面試官都有提到bind函數,萬萬沒想到,bind函數的出現率竟然如此高!html
我雖知道bind函數的用法可是並無細緻的去研究和揣摩過bind函數。因此...react
雖然說技術面中一道題不會致你餘死地,但也會下降你在技術領域高大而宏偉的形象,面試官或許會在心中暗想這娃不行。git
本文我主要根據面試時候遇到的題目,總結爲如下2個問題github
1.bind和apply(call)最根本的區別是什麼面試
2.在ES5以前手寫實現bind函數bash
若是小夥伴早知熟知這兩個問題,能夠瀏覽下一朋友正在籌劃中的 面試彙總庫app
閒事少管,走路陳展。開始正題。函數
我相信大多數朋友都深入的知道call,apply是參數列表的不一樣。但今天重點是說明ui
bind()方法建立一個新的函數,在調用時設置this關鍵字爲提供的值
apply() 方法調用一個具備給定this值的函數
關鍵在於bind函數建立了一個新的函數而且這個新的函數執行上下文不會再變
一位碼農是一個函數,他的女票就是他的對象
情比金堅,至死不渝的碼農 = 碼農.bind(對象)
而使用apply,call更像是我今天喜歡你,明天喜歡他,後天隔壁家的王喇叭,可是基本上是單相思對方都不一樣意,因此都沒能產生結果。
// 面試中回答的方法,也是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;
}
複製代碼
若是個人文章對你有幫助,我也但願可以獲得你的鼓勵,由於你的鼓勵是我前進的動力。