相关疑难解决方法(0)

循环内的JavaScript闭包 - 简单实用的例子

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)

javascript closures loops

2689
推荐指数
25
解决办法
34万
查看次数

JavaScript不支持使用局部变量进行闭包吗?

我对这段代码感到非常困惑:

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提前.

javascript closures loops

57
推荐指数
4
解决办法
2万
查看次数

从Javascript闭包中循环访问外部变量

看到:

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 jquery closures loops

36
推荐指数
1
解决办法
1万
查看次数

循环中的函数(返回另一个函数)如何工作?

我一直在尝试为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

21
推荐指数
2
解决办法
2万
查看次数

javascript关闭立即评估

请考虑以下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个打印不同索引的函数.

有任何想法吗?

javascript closures scope loops

7
推荐指数
2
解决办法
2149
查看次数

将值传递给onclick

如果我使用循环创建大量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 loops

7
推荐指数
1
解决办法
2969
查看次数

如何在闭包中引用局部变量?

我正在阅读一篇文章(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 closures loops

5
推荐指数
1
解决办法
693
查看次数

JavaScript变量范围

我遇到了一些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

我可以理解为什么这不起作用,但我想知道是否有人可以向我解释发生了什么以及为什么它不起作用!

此外,如何克服这个范围问题?

javascript closures scope loops

2
推荐指数
1
解决办法
563
查看次数