我需要帮助理解为什么下面的代码返回一个未定义的对象属性:
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,我稍后可以参考,这样我就可以循环并清除。我以为我能够循环遍历intervals.collection数组并执行类似的操作:
clearInterval(intervals.collection[0].timer)
但由于intervals.collection[0]
未定义
答案 0 :(得分:4)
您忘记了return
。
intervals.collection[0] = function () {
return this.timer = setInterval(function(){
--^^^^^^--
注意this
是指window
,我不确定向timer
元素添加属性window
是否是您实际期望的。否则,您应返回间隔ID,以免混淆全局window
范围。
使用timer
访问intervals.collection[0].timer
的简短方法是创建一个Object:
intervals.collection.push({
timer: setInterval(function(){
count++;
$("p").html(count);
}, 1000)
});
console.log(intervals.collection[0].timer);
我在此示例中使用Array.push
将新创建的间隔添加为数组的最后一个元素。
答案 1 :(得分:3)
也许你让事情变得复杂......我要做的就是将间隔直接推入阵列。
intervals.collection.push( setInterval(function(){...}, 1000) );
您不需要IIFE来执行间隔,当您将其推入阵列时也会执行。
然后你可以清除它们:
intervals.collection.forEach(function( timer ) {
clearInterval( timer );
});
答案 2 :(得分:2)
你可以这样写:
intervals.collection[0] = setInterval(function(){
$("p").html(++count);
}, 1000);
答案 3 :(得分:1)
您正在分配一个自动调用函数,这意味着您可以指定函数的返回值。函数本身不会返回任何内容,因此它未定义。