0

我有以下 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 属性。我不确定这是怎么可能的,因为音频变量是每次迭代的本地变量。我究竟做错了什么?

4

1 回答 1

0

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

if并且for不会创建新的范围,因此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/

提升:变量的声明,而不是赋值和函数声明被移动到它们定义的大部分范围的顶部时。

闭包: 即使作用域本身不存在,来自外部作用域的变量仍保持活动状态。通常当内部范围访问驻留在外部范围内的变量时。例如:如果有一个函数返回另一个函数,并且这个返回的函数使用了一个在其父函数中定义但不在其中的变量,那么即使该父函数已经返回并且不再存在,对该函数的引用也会使该变量保持活动状态。

要了解更多信息,请尝试以下操作:http: //javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/

于 2013-07-01T18:59:14.317 回答