0

这是我的代码:

var x = [{letter: "a"}, {letter: "b"}, {letter: "c"}]

x.push({
    timer: setTimeout(function() {x.splice(x.length - 1, 1)}, 3000),
    letter: "j",
})

x.push({letter: "k"})

setTimeout(function() {alert(x)}, 4000)

我的主要问题是:为什么代码应该警告“a,b,c,k”时会警告“a,b,c,[A number]”,为什么它会删除错误的索引?

4

2 回答 2

0

x.splice(x.length, 1)删除从 开始的一个元素x.length,该元素在数组边界之外;使用x.splice(x.length - 1, 1),或者只是x.pop()

如果想法是让对象从数组中删除自己,请在添加之前存储长度并使用它:

var removeIndex = x.length;

x.push({
    timer: setTimeout(function() { x.splice(removeIndex, 1); }, 3000),
    letter: "j",
});
于 2013-07-07T14:25:13.553 回答
0
x.push(setTimeout(function() {x.splice(x.length - 1, 1)}, 3000))

这实际上会将 timeoutID 推送到数组中。这之后是一个额外的 push x.push('k'),因此k当超时解决时元素实际上会被删除。

x.length将在超时函数内部发生变化。如果要使用要添加的元素的索引,请将x.length其作为变量存储在更高的范围内。

http://jsfiddle.net/rrw3s/

于 2013-07-07T14:35:15.103 回答