2011-07-31 9 views
2

少しタイマーをプログラミングしています。JavaScript:オブジェクトの問題

var counter = { 
    seconds: 100, 
    clock: function() { 
     $('input').val(this.seconds); 
     this.seconds -= 1; 
     setTimeout(this.clock(), 1000); 
    } 
}; 

counter.clock(); 

をどういうわけかhttp://jsfiddle.net/4ktEG/

私は、コードを実行するたびに、私は別の答えを得るに取り組ん例で次のようにコードがあります。何が問題ですか?

+2

これはあなたが探しているものの多くを与えるかもしれません。 //jsfiddle.net/4ktEG/13/ –

答えて

7

これはあなたが探しているカウントダウンです。

var counter = { 
    seconds: 100, 
    clock: function() { 
     $('input').val(this.seconds); 
     this.seconds -= 1; 
     setTimeout(function(){counter.clock()}, 1000); 
    } 
}; 

counter.clock(); 

http://jsfiddle.net/4ktEG/13/

+0

問題ありません。私は当初、何か他のことが起こっていると思っていました。答えの代わりにコメントとして投稿しました。 –

0

用途:

var counter = { 
    seconds: 100, 
    clock: function() { 
     $('input').val(counter.seconds); 
     counter.seconds -= 1; 
     setTimeout(counter.clock, 1000); 
    } 
}; 

counter.clock(); 

あなたが「これは」関数の内部で、何がしたいことは、「カウンター」オブジェクトを参照するために使用さです。

+0

私はまだ私がしたいことはしません。それは100を示し、その後は何も表示しません。 – Randomblue

+0

とどう違うのですか?説明してください! – markus

+0

@markus、あなたのためにコメントを追加しました。 – Darm

0

あなたが入力したsetTimeoutが呼び出されたときに消えた後、「100」を表示したい場合は、上のブラケットを取らなければならない「(this.clock)」

そのため:あなたが言う

var counter = { 
seconds: 100, 
clock: function() { 
    $('input').val(this.seconds); 
    this.seconds -= 1; 
    setTimeout(this.clock, 1000); 
} 
}; 

counter.clock(); 
+0

それは私が望むものではありません。私は100、99、98などの**カウンター**が欲しい。 – Randomblue

+0

あなたが何を意味するかわかります。 – Jacob

0

setTimeout(this.clock(), 1000); //the clock method will be called right away. 

タイムアウトがグローバルコンテキストで実行される代わりに

setTimeout(this.clock, 1000); 
0

これを使用してください。したがって、ハンドラ内の 'this'はグローバルコンテキストを参照します。目的の結果を得るには、関数を目的のコンテキストにバインドする必要があります。コンテキストパラメータを取るfunction.callまたはfunction.applyを調べてください。

var counter = { 
    seconds: 100, 
    clock: function() { 
     $('input').val(this.seconds); 
     this.seconds -= 1; 
     var closure = function() { 
      counter.clock.call(counter); 
     }; 

     setTimeout(closure, 1000); 
    } 
}; 

counter.clock(); 
1

のjQueryはthis値を結合するためjQuery.proxy()[docs]方法を有しています。

setTimeout($.proxy(counter,'clock'), 1000); 

$.proxythis値としてバインドcountercounter.clockを起動する機能を返します。


それとも、永久counter.clockcounterをバインドするために、このようにそれを使用することができます:

var counter = { 
    seconds: 100 
}; 

counter.clock = $.proxy(function() { 
    $('input').val(this.seconds); 
    this.seconds -= 1; 
    setTimeout(this.clock, 1000); 
}, counter); 

counter.clock(); 

例:のhttp:http://jsfiddle.net/bmYAN/