jquery在函数global中创建局部变量

时间:2011-02-28 23:47:41

标签: javascript jquery

我有这个函数用数据填充currsong变量。 问题是变量currsong只在函数内部可用,我需要全局访问它。

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

谢谢!

3 个答案:

答案 0 :(得分:2)

要声明全局变量,您始终可以删除var

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

不过,我不确定全局变量是否适合您尝试做的任何事情。人们建议有理由避免使用它们。

修改
An example
注意,在第一次执行函数之前,变量将是未定义的。在您的代码中,您只将其传递给audio,而您实际上并未调用它。

<强> EDIT2
作为 Tgr 备注,您还可以明确声明全局变量 window.currsong = ...。没有功能差异,但它提高了代码质量。

答案 1 :(得分: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;
});

答案 2 :(得分: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()之外也可以访问它。

编辑:例如,示例音频功能可能如下:

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

变量curSong位于传递给audio()的匿名函数中。因此,在执行匿名函数之前,它不会存在,如上面的代码所示。现在,当您运行代码时(从第一个代码段开始),匿名内部函数将curSong返回audio()audio()将返回curSong给您。