var funcs = [];
// let's create 3 functions
for (var i = 0; i < 3; i++) {
// and store them in funcs
funcs[i] = function() {
// each should log its value.
console.log("My value: " + i);
};
}
for (var j = 0; j < 3; j++) {
// and now let's run each one to see
funcs[j]();
}Run Code Online (Sandbox Code Playgroud)
它输出这个:
我的价值:3
我的价值:3
我的价值:3
而我希望它输出:
我的价值:0
我的价值:1
我的价值:2
使用事件侦听器导致运行函数的延迟时,会出现同样的问题:
var buttons = document.getElementsByTagName("button");
// let's create 3 …Run Code Online (Sandbox Code Playgroud)我对这段代码感到非常困惑:
var closures = [];
function create() {
for (var i = 0; i < 5; i++) {
closures[i] = function() {
alert("i = " + i);
};
}
}
function run() {
for (var i = 0; i < 5; i++) {
closures[i]();
}
}
create();
run();
Run Code Online (Sandbox Code Playgroud)
根据我的理解,它应该打印0,1,2,3,4(这不是闭包的概念吗?).
而是打印5,5,5,5,5.
我试过Rhino和Firefox.
有人可以向我解释这种行为吗?Thx提前.
看到:
for (var i in this.items) {
var item = this.items[i];
$("#showcasenav").append("<li id=\"showcasebutton_"+item.id+"\"><img src=\"/images/showcase/icon-"+item.id+".png\" /></li>");
$("#showcasebutton_"+item.id).click(function() {
alert(item.id);
self.switchto(item.id);
});
}
Run Code Online (Sandbox Code Playgroud)
问题是警报的item.id始终是数组中最后一项的id(this.items).怎么解决?
我一直在尝试为JavaScript中的动态创建的"a"标记的onclick事件分配一个函数.所有标记都在循环中创建,如下所示:
for ( var i = 0; i < 4; i++ )
{
var a = document.createElement( "a" );
a.onclick = function( ) { alert( i ) };
document.getElementById( "foo" ).appendChild( a );
}
Run Code Online (Sandbox Code Playgroud)
所有四个链接的警报值始终为"4".很明显.谷歌搜索时,我遇到了一个显示以下代码片段的帖子:
a.onclick = (function(p, d) {
return function(){ show_photo(p, d) }
})(path, description);
Run Code Online (Sandbox Code Playgroud)
我设法根据我的需要调整它并获得警报(i)正常工作的事情,但如果有人能够准确解释上述代码的作用,我将不胜感激.
javascript closures loops anonymous-function javascript-events
请考虑以下Javascript代码:
var a = [];
var f = function() {
for (var i = 0; i < 3; i++) {
a.push(function(){alert(i)});
}
for (var j = 0; j < 3; j++) {
a[j]();
}
};
Run Code Online (Sandbox Code Playgroud)
警报三次打印出'3'.我想要一个不同的行为 - 在循环的每次迭代中生成一个打印i的当前值的函数.即3个打印不同索引的函数.
有任何想法吗?
如果我使用循环创建大量HTML元素,比如
for (i= 1; i < 100; i++) {
var my_element = document.createElement ("td");
row.appendChild (my_element);
my_element.onclick = function () {my_function (i));
}
Run Code Online (Sandbox Code Playgroud)
然后当单击该元素时,传递给的i的值my_function始终为100,无论调用它的是哪个数字元素.我通过使用解决了这个问题
my_element.id = "something"+i;
my_element.onclick = function (e) {my_function (e.target.id)};
Run Code Online (Sandbox Code Playgroud)
(对于Internet Explorer,显然target需要srcElement.)我很想知道是否有任何方法可以创建函数而无需像这样添加ID到元素.
我正在阅读一篇文章(JavaScript Closures for Dummies),其中一个例子如下.
function buildList(list) {
var result = [];
for (var i = 0; i < list.length; i++) {
var item = 'item' + list[i];
result.push( function() {alert(item + ' ' + list[i])} );
}
return result;
}
function testList() {
var fnlist = buildList([1,2,3]);
// using j only to help prevent confusion - could use i
for (var j = 0; j < fnlist.length; j++) {
fnlist[j]();
}
}
testList();
Run Code Online (Sandbox Code Playgroud)
调用testList时,会出现一个警告框,其中显示"item3 undefined".文章有这样的解释:
当在行上调用匿名函数时,
fnlist[j]();它们都使用相同的单个闭包,并且它们在该闭包中使用i和item的当前值(其中我的值为3,因为循环已完成,并且item具有值'item3'). …
我遇到了一些JavaScript代码的问题.
脚本
setTimeout(function() {
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, i * 200);
}
}, 200);
Run Code Online (Sandbox Code Playgroud)
输出
5,5,5,5,5代替1,2,3,4,5
我可以理解为什么这不起作用,但我想知道是否有人可以向我解释发生了什么以及为什么它不起作用!
此外,如何克服这个范围问题?