我有这个函数用数据填充currsong变量。 问题是变量currsong只在函数内部可用,我需要全局访问它。
// get a single audio url
echonest.artist(artist).audio( function(audioCollection) {
var currsong = audioCollection.data.audio[0].url;
return currsong;
});
谢谢!
答案 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
给您。