2012-08-04 94 views
0

因此,偶爾有一段時間,爲了好玩,我檢查了Facebook的來源以找到各種瘋狂的JavaScript。因此,在Facebook上的聊天textarea的KEYUP將函數直接鏈接到函數(){}

,我發現:

Bootloader.loadComponents(["control-textarea"], function() { 
    TextAreaControl.getInstance(this) 
}.bind(this)); 

這似乎並不直到我意識到那.bind()直接加入該功能引起我的興趣。

我不知道你能做到這一點。

任何功能都可以跟其他function(){}一樣嗎?或者是否有一種特殊的方式需要這樣做。

我知道你可以連鎖像"How are you doing!".replace(/\w{3}/g,'').toUpperCase()這樣的東西,但並不認爲你直接鏈接到function(){}本身。

+0

您不是「鏈接」function(){}調用,而是鏈​​接'.loadComponents()'調用。 – Blender 2012-08-04 17:46:40

+0

它們在'.loadComponents()'裏面「鏈接」函數。 'function(){ TextAreaControl.getInstance(this) } .bind(this)' – Shawn31313 2012-08-04 17:48:54

+0

@Blender:不按照括號順序。看來loadComponents正在傳遞兩個參數。一個數組和一個鏈接綁定調用的匿名函數 – jdi 2012-08-04 17:49:00

回答

1

.bind是功能對象在ES5環境中可用的屬性,或.bind已被添加到Function.prototype。它就像對象或原型鏈上可用的任何其他屬性一樣。

.bind方法返回一個新的函數及其調用上下文(以及提供的參數)永久綁定到該新函數。新函數調用原始函數的代碼體,所以除了綁定的上下文和參數之外,行爲是相同的。

+0

感謝文檔@Bergi。 :) – 2012-08-04 17:53:53

+0

哦,看到我甚至不知道你可以做'Function.prototype',我只知道使用'String','Number','Array'和'Date'的原型。謝謝 – Shawn31313 2012-08-04 17:54:05

+1

@ Shawn31313:不客氣。是的,JavaScript中的函數只是另一種類型的對象。它們是獨一無二的,因爲它們是可調用對象,但在大多數其他方面,它們非常類似於任何其他對象。你可以添加屬性給他們。這就是例如'jQuery'既可以是一個函數,也可以是一個名稱空間。 '$(「foobar」)'和'$ .extend()'都是有效的,即使'$'是一個函數。還有其他常用的'Function.prototype'屬性,比如'.call'和'.apply'。 – 2012-08-04 17:55:40