0

我需要帮助理解为什么以下代码返回未定义的对象属性:

var count = 0;
var intervals = {
    collection : []                      
}

intervals.collection[0] = function () {
    this.timer = setInterval(function(){
       count++;
       $("p").html(count);            
    }, 1000);
}();

if(typeof intervals.collection[0] === "undefined") {
    $("span").html("undefined");        
}​

工作示例:http: //jsfiddle.net/tvaQk/8/

基本上,我希望能够保留一组 setIntervals 供以后参考,以便循环并清除。我在想我可以遍历 interval.collection 数组并执行以下操作:

clearInterval(intervals.collection[0].timer)

但不能因为intervals.collection[0]未定义

4

4 回答 4

4

你忘了return.

intervals.collection[0] = function () {
  return this.timer = setInterval(function(){
--^^^^^^--

注意this是指window,我不确定向元素添加属性timer是否window是您实际期望的。否则,您应返回间隔 id 以免弄乱全局window范围。


能够访问timerusing的一种简短方法intervals.collection[0].timer是创建一个 Object :

intervals.collection.push({
  timer: setInterval(function(){
    count++;
    $("p").html(count);            
  }, 1000)
});

console.log(intervals.collection[0].timer);

Array.push在此示例中使用了将新创建的区间添加为数组的最后一个元素。

于 2012-12-11T21:26:00.723 回答
3

也许你让事情复杂化了......我要做的就是将间隔直接推入数组。

intervals.collection.push( setInterval(function(){...}, 1000) );

您不需要 IIFE 来执行间隔,当您将其推入数组时,它也会执行。

然后你可以像这样清除它们:

intervals.collection.forEach(function( timer ) {
  clearInterval( timer );
});
于 2012-12-11T21:28:37.693 回答
2

你可以简单地这样写:

intervals.collection[0] = setInterval(function(){
    $("p").html(++count);            
}, 1000);
于 2012-12-11T21:26:26.693 回答
1

您正在分配一个自调用函数,这意味着您分配了函数的返回值。该函数本身不返回任何内容,因此它是未定义的。

于 2012-12-11T21:30:22.853 回答