2011-06-23 78 views
2

我一直浸我的腳趾到Javascript和現在看下面這段代碼:在Javascript中綁定回調函數? (不要與Function.prototype.bind()相混淆)

var router = new(journey.Router)({ 
    ... 
    }); 

    router.root.bind(function (res) { res.send("Welcome") }); 

問題:什麼是上面的根功能勢必?這個綁定有什麼作用?

據我所知,'bind()'應該將一個函數的執行綁定到一個指定的對象作爲上下文。我不明白如何將函數/方法綁定到其他函數。我所看到的所有參考文獻都在討論綁定到一個對象。

回答

4

「根」是在journey.js(在線路145)作爲

get root() { 
    return this.get('/'); 
}, 

限定的吸氣劑的方法,其是僅僅爲了

get('/') 

而在這種情況下,呼叫的權宜速記綁定會將​​提供的回調函數與以root身份定義的路由相關聯,以便任何匹配根路徑('/')的請求都將由字符串'Welcome'回答。

修訂

一旦journey.js源的進一步檢查,它出現在該上下文中,使用綁定的()是不討好在所有的例子。這個特定的bind()被定義爲route()返回的對象的一個​​函數(它依次在第131行的journey.js中被get()調用),並且僅用於設置(或者綁定)特定路由的處理程序。

重要:此呼叫綁定()IS NOT相同Function.prototype.bind()。

因爲我相信有關咖喱的信息在這種情況下仍然有價值,

這個使用Function.prototype。bind()被稱爲'currying',用於提供一個新的函數,該函數已經爲一個或多個預期參數提供了值。 一個簡單的咖喱例子就是假設: function addSome(amount,value){ return value + amount; } 它可以被用來產生一個新的功能: var addOne = addSome.bind(1); 並且完全相同: 函數addOne(value){ return addSome(1,value); } Currying是[函數式編程]中的一個特性。 有關此技術的正式定義的bind()和[currying]的解釋,請參見[bind-MDN Docs]。 [功能程序設計]:http://en.wikipedia.org/wiki/Functional_programming [bind-MDN Docs]:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/bind [currying]:http://en.wikipedia.org/wiki/Currying
+0

這是脫離上下文的方式。你怎麼知道它來自哪個代碼片段?如何工作,不是從'.get('/')'按值傳遞的函數返回的函數,而是將其綁定到該函數的本地副本。這是該庫的一些可怕的魔法API。 – Raynos

+0

@Raynos,剛剛更新了有關'currying'的更多信息,這是該庫使用的技術。我知道它來自哪裏,因爲我查看了源代碼。 ;) –

+0

@RobRaisch你意識到'.bind'的第一個參數是上下文,第二個(和之後)是curried參數。還有一個問題是綁定函數沒有保存在任何地方。如果您不打算將綁定函數存儲在變量中,綁定似乎毫無用處。 – Raynos

0

不完全熟悉您使用的對象,但它使用javascript「匿名函數」創建一個包含一段代碼的對象,以便它可以像變量一樣傳遞。稍後可以通過將()添加到末尾來調用它。

參見:http://helephant.com/2008/08/23/javascript-anonymous-functions/

可能通過調用最常見的使用這樣的事情是設置一個回調函數,也就是說,當你調用路由器的功能,該功能完成後,將完成的一切你首先必須遵守它。

假設我使用通用JavaScript庫(如colorbox)彈出屏幕上的對話框並提示用戶輸入信息。一旦完成,或者如果用戶關閉盒子而不輸入任何東西,我希望盒子做一些自定義的事情。我不想在colorbox的源代碼中進行挖掘,因此它們允許各種回調函數的位置。說當用戶輸入信息並點擊一個按鈕時,它會關閉colorbox,提交一個jax,並刷新底層頁面。