Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/364.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.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作用域_Javascript_Jquery_Scope - Fatal编程技术网

循环内的JavaScript作用域

循环内的JavaScript作用域,javascript,jquery,scope,Javascript,Jquery,Scope,我有以下JavaScript代码: for (var x = 0; x < queue.length; x++) { var song = new Song().loadJSON(queue[x]); //Not already loaded if (loaded.indexOf(song.url) == -1) { addRow("play", song.url, song.title, song.album, song.artist);

我有以下JavaScript代码:

for (var x = 0; x < queue.length; x++) {
    var song = new Song().loadJSON(queue[x]);
    //Not already loaded
    if (loaded.indexOf(song.url) == -1) {
        addRow("play", song.url, song.title, song.album, song.artist);
        loaded.push(song.url);
        songs.push(song);
        if (song.duration == 0) {
            var audio = $("<audio>");
            audio.attr("songid", songs.length - 1);
            console.log("Writing:", audio.attr("songid"));
            audio.on("durationchange", function () {
                var id = audio.attr("songid");
                console.log("Reading:", id);
                songs[id].duration = audio[0].duration;
            });
            audio.attr("src", song.url);
        }
    }
}
这让我相信songid属性在for循环的每次迭代中都会被重写。我不确定这是怎么可能的,因为音频变量是每个迭代的局部变量。我做错了什么?

var audio=$(“

Ex:

var someVariable; //global scope.
function abc () {
  var someVariable; //in new scope.
}
or
var fn = function () { var inNewScope;};
创建新范围的其他方法

callingFunction(parameter); 
变量参数将在该函数的新范围内

其他有用的链接:

提升:变量声明而非赋值时,&函数声明移动到其定义范围的最顶部

闭包:当外部作用域中的变量保持活动状态时,即使作用域本身不存在。通常当内部作用域访问驻留在外部作用域中的变量时。例如:如果有函数返回另一个函数,而此返回的函数使用的变量是其父函数定义的而不是其中的,则引用即使父函数已返回且不再存在,该函数的nce也会使该变量保持活动状态


要了解更多信息,请尝试以下内容:

是什么让您相信
audio
变量是“local”的?JavaScript只有函数作用域(或全局作用域).Blocks不会创建作用域。另外,欢迎使用JavaScript闭包!您假设一个块会创建一个局部变量作用域。它不会。@Franz:所有变量声明都会被提升。也就是说,如果您将
var foo=…;
放在代码的任何地方,就好像您在脚本或函数的顶部编写了
var foo;
。或者换句话说:在执行函数之前,引擎收集所有变量(和函数)声明,并在函数环境中为每个声明创建绑定。该过程的技术描述可在规范中找到:(步骤8).FWIW,您可以通过使用
$.each
在数组上迭代来轻松解决此问题。因为这样您每次迭代都会执行一个函数(即每次迭代创建一个新范围)。
callingFunction(parameter);