5

至少我认为在这种情况下会发生这种情况:

function MyFunc() {
    var people = Array({name: 'Alex', age: 25}, {name: 'Ellen', age: 43});
    for (var i=0; i<people.length; i++) {
        setTimeout(function() { ShowIt(people[i].name) }, 1000); // !!!
    }
}

function ShowIt(name) {
    alert(name);
}

我收到此错误Uncaught TypeError: Cannot read property 'name' of undefined,因此看起来在setTimeout侦听器函数内部people无法访问该变量。为什么以及如何解决?

4

1 回答 1

24

其实阵是可以的。发生的事情是您的 i 实际上是 2 并且数组中没有第三个元素。这就是您收到此错误的原因。这是解决方案:

function MyFunc() {
    var people = Array({name: 'Alex', age: 25}, {name: 'Ellen', age: 43});
    for (var i=0; i<people.length; i++) {
        (function(i) {
            setTimeout(function() {             
                ShowIt(people[i].name) 
            }, 1000);
        })(i);
    }
}

function ShowIt(name) {
    console.log(name);
}

MyFunc();

这是一个 jsfiddle http://jsfiddle.net/krasimir/XDfLu/2/

长答案:当您使用 setTimeout 时,您正在向它传递一个函数。将来会调用该函数,并且您在那里所做的事情也会在将来执行。在那一刻(未来),你的 i 不再是 0 或 1。它实际上是 2,因为你的循环结束了。提供的解决方案使用额外的闭包来创建更多的范围/上下文。一旦调用了传递给 setTimeout 的函数,它就会查找 ai 变量。在它的范围内没有这样的东西,所以它上升了一个层次。还有我们需要的实际值。

于 2013-08-26T13:33:59.607 回答