在JavaScript中,我知道閉包可以被定義爲一個嵌套函數,它可以訪問它的包含函數的變量。例如:根據它們的構造方式,回調函數也可以定義爲閉包?
function outerFunction(x, y) {
function innerFunction() {
return x + y + 10;
}
return innerFunction;
}
現在,下面的代碼是連接最多爲請求對象的屬性onreadystatechange
回調;然而,我在想,如果,顧名思義,這也被認爲是一個封閉:
/* This is a contrived example, I know.
* Bear with me - it demonstrates the point I'm trying to convey. */
function submitHandler() {
var oRequest = createRequest(); // assume I'm getting an instance of the xhr
var sUsername = 'Tom'; // assume this is needed for work in the handler
var This = this;
oRequest.onreadystatechange = function() {
This.handleResponse(oRequest, sUsername)
}
}
function handleResponse(oResponse, sUsername) {
if(oResponse.readyState === 4 && oResponse.status === 200) {
// do work with the username
} else {
// we're not done yet...
}
}
我意識到handleResponse
功能也只是被寫成的submitHandler
背景下的匿名函數,但我發現如果回調函數在函數調用範圍之外定義,那麼更復雜的Ajax代碼可以更易讀並且易於維護。再次,這是一個人爲的例子,我只是用來展示我的問題。
+1注意到第一個不是閉包。 – 2009-01-19 13:43:42