Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jquery使函数中的局部变量成为全局变量_Javascript_Jquery - Fatal编程技术网

Javascript jquery使函数中的局部变量成为全局变量

Javascript jquery使函数中的局部变量成为全局变量,javascript,jquery,Javascript,Jquery,我有一个用数据填充currsong变量的函数。 问题是变量currsong只在函数内部可用,我需要全局访问它 // get a single audio url echonest.artist(artist).audio( function(audioCollection) { var currsong = audioCollection.data.audio[0].url; return currsong; }); 谢谢大家! 要声明全局变量,您可以始终删除var:

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

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

谢谢大家!

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

currsong = audioCollection.data.audio[0].url;
不过,我不确定全局变量是否是解决任何问题的好方法。人们建议避开它们是有原因的

编辑
.
注意,在第一次执行函数之前,变量将是未定义的。在代码中,您只将其传递到
音频中
,实际上并没有调用它

edit2

Tgr所述,您还可以显式声明全局变量:
window.currsong=…
。虽然没有功能上的区别,但它提高了代码质量。

Scope是javascript中的一只有趣的鸟。结束也是如此

观察1:您正在从内联函数返回一个值;这个返回值是没有意义的

观察2:通过使用“var”关键字,您指定了一个局部范围。删除var将使变量成为全局变量。但是,即使这样做,也有可能在触发函数之前尝试访问该变量(即,该变量未定义)

由于您刚刚开始了解闭包和javascript作用域的概念,我建议您先阅读闭包和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;
});

我已经重写了你的代码,让自己和其他人更清楚一点。如果我的音译有误,请告诉我

基本上,看起来您正试图按如下方式获得curSong:

echonest.artist(artist).audio(
    function(audioCollection){
        var curSong = audioCollection.data.audio[0].url;
        return curSong;
    }
);
function audio(inputFunction){
    var audioCollection = getAudioCollection();
    var song = inputFunction(audioCollection);
    return song;
}
现在,您要做的是将一个函数(由
函数(audioCollection)
定义的匿名函数)传递给
艺术家(艺术家)
返回的任何对象的
音频
函数。同样地,
curSong
值返回到
audio()
,并且仅当
audio()
实际运行其所处理的函数时才返回。我会看看
audio()
,试着看看是否有办法让
curSong
摆脱它。否则,我会像上面所描述的那样,在更大的范围内声明
curSong
,这样即使在
audio()
之外也可以访问它

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

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

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

这里没有问题。。。这只是一个模糊的语句和一段代码。这是一个结构不良问题的完美例子。你能分享一下你用来调用这个函数的代码吗?你可以这样做,但我不相信使用全局变量是解决这个问题的最佳方法。@quanticle我们没有被问到“如何解决这个问题”,我们被问到了“如何将此变量声明为全局变量“我也想提出更好的解决方案,但OP并没有就此描述他的问题。关于我们被问到的问题,我承认这一点。不管怎样,我坚持认为,如果添加全局变量是你的第一选择,那么你就做错了。@quanticle然后对OP说,也许你会说服他:)我自己已经在帖子中提出了警告。
window.currsong
更可取,因为这表明1)currsong是全局的,2)它是有意全局的。省略var是一个容易犯的错误,因为没有注意到它不存在。像JSLLT这样的工具甚至会把隐含的全局错误看成是错误的,严格的模式是禁止的。谢谢SLIFTY,我试过了,它确实没有定义。谢谢你的帮助,谢谢你的帮助。基本上,curSong变量在函数外部是不可用的,即使前面没有变量。我不知道如何从另一个函数访问它
audio()
应该可以访问
curSong
,因为该函数正在返回
curSong