2012-02-14 23 views
1

我有以下的jQuery函數:在jQuery函數外部獲取JSON響應var?

function deleteHype(){ 
    FB.api('/me/launchhype:hype', function(response) { 
      $.each(response.data, function(i, obj){ 
        if (obj.data.launch.url == '<?php the_permalink(); ?>') { 
          var delete_launch_id = parentObj=obj.id; 
        } 
      }); 
    }); 
} 
alert(delete_launch_id); 

讓IF語句中的VAR 「delete_launch_id」 是 「X」 之稱。那麼,如果我嘗試在函數外面執行「delete_launch_id」警報,則它是「未定義的」。我想讓它回到「X」(設定的假設值)。

我該怎麼做?我迷路了,似乎無法找到類似的例子。

回答

1

根據大衆的需求,下面更深入地看一下爲什麼變量「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對待就像一個變量(因爲它是),並且可以調用它,因爲它是一個函數,並且它內部的代碼將在調用時執行。這是一個非常方便的模式。

我希望有點幫助。起初這是令人困惑的東西。

+0

你搖滾。非常感謝這個解釋。更有意義。 – 2012-02-15 01:15:25

0

將該變量聲明爲全局變量(或者在需要它的任何地方訪問該變量)。

問題是,一旦你這樣做,你需要擔心它何時被訪問,以及當時是否合理訪問它。更好的解決方案取決於你實際想要做的事情。

但是,通常情況下,最好將這種異步的東西保持在本地,並使用函數來操作回調中的狀態。例如,您可以將一個函數傳遞給deleteHype,這些函數使用ID做「正確」的事情,在回調中完成工作,從回調函數或傳遞給它的函數操縱DOM等。

+1

就個人而言,我絕不會鼓勵初學者居然把一個變量在全局範圍內。這是你不想進入的壞習慣。 – reedlauber 2012-02-15 00:05:34

+0

@reedlauber這就是爲什麼有超過第一句話。然而,這是一種實現他們想要的方式的實際方式(以我的答案的其餘部分爲模),並不總是人們想象的恐怖。這是一種工具,和其他任何東西一樣 - 它可以被濫用,但並不總是明確的「錯誤」。而且,初學者知道的內容是有限制的,並且可以執行並且仍然能夠進行調試。 – 2012-02-15 00:07:16

+0

你不能聲明一個全局變量,修改一個函數內部的變量,然後將該變量傳遞給另一個函數,而不將該變量作爲參數傳遞。 – Ohgodwhy 2012-02-15 01:19:47

0

我贏了「T進入所有的原因,你不能在代碼中‘看到’delete_launch_id在這一點上,但也許這樣的事情會的工作?:

function deleteHype(callback){ 
    FB.api('/me/launchhype:hype', function(response) { 
      $.each(response.data, function(i, obj){ 
        if (obj.data.launch.url == '<?php the_permalink(); ?>') { 
          if(typeof callback === 'function') { 
           callback(obj.id); 
          } 
        } 
      }); 
    }); 
} 

deleteHype(function(delete_launch_id) { 
    alert(delete_launch_id); 
}); 
+0

我想「進入」所有你爲什麼不能從代碼點看到delete_launch_id的原因也正是OP需要能夠了解底層技術,而不是被spoonfed代碼。教一個人去釣魚...... – 2012-02-15 00:07:53

+0

我同意,但功能範圍,關閉和異步代碼是相當大的話題。下次... – reedlauber 2012-02-15 00:10:59

+0

這似乎沒有做任何事情?並且爲了記錄,我確實同意Paolo,我知道這可能會讓人困惑,但請您知道我不一定在尋找一個簡單的答案。它也有助於理解發生了什麼! :) – 2012-02-15 00:46:42

0

你需要做的是通過變量作爲兩個函數之間的參數。

function deleteHype(){ 
    FB.api('/me/launchhype:hype', function(response) { 
    $.each(response.data, function(i, obj){ 
     if (obj.data.launch.url == '<?php the_permalink(); ?>') { 
     var delete_launch_id = parentObj=obj.id; 
     } 
    }); 
    }); 
} 
function grabID(delete_launch_id){ 
    alert(delete_launch_id); 
} 

您的第一個功能是完全正確的。現在你只需要第二個函數來獲取參數並輸出它;如下所示。

function grabID(delete_launch_id){ 
    alert(delete_launch_id); 
} 

現在,你需要輸出的delete_launch_id可以使用grabId。

+0

我不知道,我把你給了我這個新功能呢?你可以給我一個例子嗎?謝謝! – 2012-02-15 00:45:59

+0

請參閱上面的編輯。 – Ohgodwhy 2012-02-15 01:10:25