2017-09-23 128 views
0

我仍在學習bind和箭頭函數的細節。在現在的JavaScript中,在以前使用過「綁定」的情況下無法使用箭頭函數嗎?

看來,無論我們曾經使用bind,我們現在都應該使用箭頭函數,儘管我還沒有看到它完全按照這種方式拼寫。

所以我想知道如果這是真的,或者有些情況下我們仍然應該使用bind即使箭頭功能可能工作,或者某些情況下箭頭功能不起作用,bind仍然是唯一的方法做你想做的事。或者,如果我完全關閉,在新的JS代碼中,我應該什麼時候選擇箭頭函數,何時應該更喜歡bind

+2

好吧,如果你想要綁定到'this'之外的東西,那麼你需要使用'.bind'。不經常出現。 –

+0

我見過除了* this之外還可能綁定*的情況,在這種情況下,箭頭函數仍然可以工作,您只需將它們作爲附加參數傳遞即可。我還沒有看到'bind'在沒有'this'的情況下可以使用,但它肯定是可能的,所以我猜它偶爾會被執行( - : – hippietrail

+0

)投票重新打開。其他問題的答案都沒有列出任何使用情況綁定箭頭功能。這裏的答案是獨一無二的。 – hippietrail

回答

3

我看到2個優點:

部分應用程序:

可以使用的結合方法,預先設定的函數的參數;它可以讓你在進行調用之前通過傳遞一個參數來創建一個函數的子函數(不是字面意思,幕後,只會有一個函數),這樣你預設的這個參數將被用於bind返回的函數的所有調用。 @Charlie_H已經說明這一點,但我會提供一個例子,以及:

function foo(bar, baz) { 
return bar + baz; 
} 

var sub_foo = foo.bind(Object.create(null), 20); 

console.log(sub_foo(60)); 
console.log(sub_foo(120)); 

所以你可以在上面的例子中看到的,bind方法使得我可以建立你可以稱之爲一個子功能關閉foo,此功能將始終使用20作爲其第一個參數。

現在再次,不要讓我可憐的字眼誤導你,bind實際上並沒有創建一個新的功能!在幕後,將使用原始功能,唯一是bind將執行其一些魔術,以便始終使用傳遞給bind的參數。我使用的是「子功能」這個詞,因爲它讓整個事情更容易理解。結合目標函數任何你想要的對象this



能力:

脂肪箭頭功能,脂肪箭頭功能的this將永遠被綁定到的this封閉範圍;與綁定,可以綁定目標函數的this到任何你想要的對象:

function foo() { 
return this.baz; 
} 

var bar = foo.bind({baz: "Hell yeah!"}); 

bar(); // "Hell yeah!" 


此外,this脂肪箭頭功能結合是不可重寫,這是一個微妙的細節,但仍然有用。


還有一兩件事我想補充,在書中你不知道JS:此&對象原型,凱爾·辛普森說,你不應該使用脂肪箭頭功能來繞過this的複雜性,這有點彎曲JavaScript的this規則,因爲它們的用法根源於var self = this模式,並且該模式的用法源於對JavaScript的this行爲缺乏理解。短版:他更喜歡bind。 儘管我沒有看到使用胖箭頭函數的任何內容,但他們甚至可以讓代碼更具可讀性,因爲通過查看它們,您可以看到開發人員想要做什麼,以及他們如何使用它,同時使用bind ,您不知道開發人員想要做什麼以及他們爲什麼要這樣做,直到您看到bind的第一個參數。我建議使用胖箭頭功能,當您希望胖箭頭功能的this綁定到當前範圍的thisbind時,您希望它綁定到其他東西。


如果您不明白我的答案的部分內容,請問我,我會盡力詳細說明評論。

2

我發現bind方法的一個附加優點,因爲它可以部分應用。

function list() { 
    return Array.prototype.slice.call(arguments); 
} 

var list1 = list(1, 2, 3); // [1, 2, 3] 

// Create a function with a preset leading argument 
var leadingThirtysevenList = list.bind(null, 37); 

var list2 = leadingThirtysevenList(); 
// [37] 

var list3 = leadingThirtysevenList(1, 2, 3); 
// [37, 1, 2, 3] 

(禮貌here

我考慮的情況下箭頭功能,其中一個速記語法是方便和執行上下文不應該是自己的。

相關問題