2011-02-28 91 views
-1

我有這個函數用數據填充currsong變量。 問題是變量currsong只在函數內部可用,我需要在全局訪問它。jquery使局部變量在全局函數中

// get a single audio url 
echonest.artist(artist).audio(function(audioCollection) { 
    var currsong = audioCollection.data.audio[0].url; 
    return currsong; 
    }); 

謝謝!

+2

這裏沒有任何問題......只是一個模糊的陳述和一段代碼。這是一個糟糕的結構問題的完美例子。 – Zoidberg 2011-02-28 23:49:29

+0

你可以請你分享你使用的代碼來調用這個函數。 – Mottie 2011-03-01 00:04:37

+0

在這裏你去fudgey http://jsfiddle.net/2sCSC/ – Ronal 2011-03-01 00:08:36

回答

2

要聲明一個全局變量,你可以隨時刪除var

currsong = audioCollection.data.audio[0].url; 

我不知道,如果一個全局變量是無論你試圖做一個很好的解決方案,但。人們建議由於原因避開它們。

編輯
An example
注意,變量在第一次執行函數之前是未定義的。在你的代碼中,你只能將它傳遞給audio,你實際上並沒有調用它。

EDIT2
作爲TGR筆記,你也可以聲明全局變量明確window.currsong = ...。沒有功能差異,但它改善了代碼質量。

+0

我試過了,它實際上回來undefined – Ronal 2011-02-28 23:50:22

+0

你可以這樣做,但我不相信使用全局變量是解決這個問題的最好方法。 – quanticle 2011-02-28 23:58:58

+0

@quanticle我們沒有被問及「如何解決這個問題」,我們被問到「如何聲明這個變量全局」。我也想提出更好的解決方案,但OP沒有描述他的問題。 – 2011-03-01 00:00:51

0

範圍是JavaScript中的一個有趣的鳥。關閉也是如此。

觀察1:你從一個內聯函數返回一個值;那個返回值是沒有意義的。

觀察2:通過使用「var」關鍵字指定一個本地作用域。刪除var將使全局變量。但是,即使你這樣做了,你可能會試圖在函數被觸發之前訪問該變量(即它將是未定義的)。

由於您剛剛開始圍繞關閉和javascript範圍的概念進行打包,因此建議您先閱讀一下,然後重新考慮您的應用程序設計(因爲我願意打賭您會學到一些東西這提示另一種方法)。

同時,嘗試在內聯函數之外定義變量並給它一個臨時值。之後,從函數內部刪除「var」。

// get a single audio url 
var currsong = "temporary value"; 
echonest.artist(artist).audio(function(audioCollection) { 
    currsong = audioCollection.data.audio[0].url; 
    return currsong; 
}); 
+0

謝謝slifty,我試過了,它確實回來了undefined。我感謝 – Ronal 2011-03-01 00:02:34

0

我重寫了你的代碼,使它對我自己和其他人更清晰一些。如果我錯誤地轉譯了某些內容,請讓我知道。

基本上,它看起來就像你正在試圖獲得curSong如下:

echonest.artist(artist).audio(
    function(audioCollection){ 
     var curSong = audioCollection.data.audio[0].url; 
     return curSong; 
    } 
); 

現在,你正在做的是傳遞函數(由function(audioCollection)定義的匿名函數)到audio功能任何artist(artist)返回。因此,curSong值返回到audio(),然後只有當audio()實際運行它交給它的函數。我會看看audio()並嘗試查看是否有辦法從中獲得curSong。否則,我會這樣做,並且在更大的範圍內聲明curSong,這樣即使在audio()之外也可以訪問它。

EDIT:例如,一個樣本音頻功能可以如下:

function audio(inputFunction){ 
    var audioCollection = getAudioCollection(); 
    var song = inputFunction(audioCollection); 
    return song; 
} 

可變curSong是在被傳遞到audio()匿名函數。因此,它不存在,直到執行匿名函數,如上面的代碼。現在,當您運行您的代碼(從第一個代碼片段)時,匿名內部函數將返回curSongaudio(),並且audio()將返回curSong給您。

+0

的幫助,謝謝你的評價。基本上,即使沒有前面的var,curSong var也不能從函數外部獲得。我不知道如何從另一個函數訪問它。 – Ronal 2011-03-01 00:11:45

+0

'audio()'應該可以訪問'curSong',因爲函數返回'curSong'。 – quanticle 2011-03-01 01:09:09