循环中的JavaScript范围

时间:2013-07-01 18:29:53

标签: 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);
        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);
        }
    }
}

打印出来:

Writing: 0 
Writing: 1 
Writing: 2 
(3x) Reading: 2 

这使我相信在for循环的每次迭代中都会写入songid属性。我不确定这是如何可能的,因为音频变量是每次迭代的本地变量。我做错了什么?

1 个答案:

答案 0 :(得分:0)

var audio = $("<audio>");现在是全局变量或全局范围,除非for循环在函数内

iffor不会创建新范围,因此variable audio会被覆盖。

所以你的信念是正确的。

只有函数中的变量在新范围内,或者参数传递给函数。

http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html

Ex:

var someVariable; //global scope.
function abc () {
  var someVariable; //in new scope.
}
or
var fn = function () { var inNewScope;};

创建新范围的其他方式

callingFunction(parameter); 

变量参数将位于此函数的内部新范围内。

其他有用的链接: http://bonsaiden.github.io/JavaScript-Garden/

吊装:变量声明时,不是分配,&amp; 功能声明被移到他们定义的范围的最顶层。

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

要了解详情,请尝试:http://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/