根據大衆的需求,下面更深入地看一下爲什麼變量「delete_launch_id」在「alert」函數訪問的地方不可用。
有幾件事情正在進行。
首先,FB.api函數很可能是一個異步AJAX調用。 JavaScript並不是真正的異步(但),但在這種情況下,它的行爲如此有效。這意味着當異步代碼執行時,代碼將在異步代碼等待響應時繼續執行。因此,如果您調用「deleteHype」,然後緊接着「alert」,很有可能FB.api響應在調用「alert」時不會返回。因此,異步代碼中設置的任何內容都將不可用。
第二個問題是JavaScript有「功能範圍」。這意味着,實際上,一個函數內定義的變量只能在該函數內部使用。它在該功能中只有「範圍」。考慮下面的代碼:
var foo = 1;
if(1 === 1) {
// non-function block. foo is accessible in here, and any changes to foo will be seen outside this block.
foo = 2;
}
// foo is 2
function change() {
// functional scope. variables defined in here are only available here
foo = 3;
var bar = 1;
}
// foo is 2 because we haven't called change yet
// bar is "undefined"
change();
// foo is 3
// bar is "undefined"
「foo」由於它的作用域超出函數範圍而改變,所以函數可以訪問它。 「酒吧」然而,只有在該功能範圍內,並沒有其他地方存在。
在最初的例子,「delete_launch_id」聲明裏面的幾個功能,實際上,所以它不是其他任何地方。
我的第一個答案通過傳遞函數進入「deleteType」功能的「回調」,只有當異步代碼執行完畢並返回將被調用來解決這些問題。這處理問題#1。回調函數然後將「delete_launch_id」傳遞給它,這使得它可用。我給的格式看起來可能有點怪異:
deleteHype(function(delete_launch_id) {
// alert
});
這是怎麼回事的是,我們實際上是傳遞一個函數作爲變量。這是一個「匿名」功能(沒有名字)。所以deleteType對待就像一個變量(因爲它是),並且可以調用它,因爲它是一個函數,並且它內部的代碼將在調用時執行。這是一個非常方便的模式。
我希望有點幫助。起初這是令人困惑的東西。
你搖滾。非常感謝這個解釋。更有意義。 – 2012-02-15 01:15:25