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ことが実際に期待していたものであるかどうかはわかりません。それ以外の場合は、グローバルwindowスコープが乱雑にならないように間隔IDを返す必要があります。


timerを使用してアクセスできるようにする簡単な方法intervals.collection[0].timerは、代わりにオブジェクトを作成することです。

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 は必要ありません。間隔を配列にプッシュすると、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 に答える