我有以下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属性。我不确定这是如何可能的,因为音频变量是每次迭代的本地变量。我做错了什么?
答案 0 :(得分: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/
吊装:当变量声明时,不是分配,&amp; 功能声明被移到他们定义的范围的最顶层。
关闭:当外部scoper中的变量保持活动时,即使范围本身不存在。通常当内部作用域访问变量驻留在out范围内时。例如:如果有函数返回另一个函数,并且这个返回的函数使用一个已定义其父函数而不在其中的变量,则引用该函数会使该变量保持活动状态,即使该父函数已返回且不再存在。
要了解详情,请尝试:http://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/