2016-12-08 6 views
0

カウンタオブジェクトの作成に問題があります。私がそれをしたいのは、新しく作成されたオブジェクトでタイマーを開始することです。オブジェクト変数がグローバル変数として設定されていない限り、タイマーは起動しません。誰かがこれを見て、私を助けてくれる?ここでCounterDownタイマオブジェクトが間違った 'this'値を使用しています

はコードです:私はこのコードを入力すると

function Clock(timeInMinutes){ 
    this.seconds = timeInMinutes * 60; 
    this.current = 0; 
} 

Clock.prototype = { 
    constructor: Clock, 
    start: function(){ 
     function increase(){ 
      if(this.current <= this.seconds){ 
       console.log(this.current); 
       this.current++; 
      } 
     } 
     setInterval(increase,1000); 
    } 
}; 

何も起こりません:

var clock = new Clock(1); 
clock.start(); 

物事を私はこれを行う場合にのみ起こる:

this.current = 0; 
this.seconds = 60; 

なぜ "ですが私はそれが欲しいと思うように動作していない開始関数内のこの '値?

+0

'のsetInterval(increase.bind(本)、1000)を試してみてくださいとして機能呼び出しthat= this .Thenのプロトタイプ関数を宣言しone.so異なっています; '。 MDNには、[どのように 'が動作するか](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/this)の説明があります。 – nnnnnn

+0

@nnnnnnこの仕組みを説明できますか?増加関数が新しく作成されたオブジェクトから呼び出された場合、 'this'値はオブジェクトにバインドされません。 – Nate

+0

いいえ、そうではありません。関数内の 'this 'の値は、その関数がどのように呼び出されるかによって決まります。 'clock.start()'のような "ドット"表記法を使うことは 'start()'の中で 'this'値が' clock'であることを意味しますが、 'increase()'はそう呼ばれません。リンクされたページを読んでください(残念ながら、数回編集されていましたが、これまでのようにはっきりしていませんが、基本はカバーしています)。 – nnnnnn

答えて

0

これを試してください。

Clock.prototype = { 
    constructor: Clock, 
    start: function(){ 
     var that = this; 
     function increase(){ 
      if(that.current <= that.seconds){ 
       console.log(that.current); 
       that.current++; 
      } 
     } 
     setInterval(increase,1000); 
    } 
}; 

http://jsbin.com/nasuyuyove/1/edit?js,console,output

+0

閉じる... 'that'宣言を' increase() 'の外側に移動する必要があります。なぜそれが最初の場所に必要なのかを説明するのはいいでしょう... – nnnnnn

0

をお試しください:var that=this;start機能&別の関数の中でもstart機能のみthere.Prototype。関数の内部that .itsプロトタイプthis

function Clock(timeInMinutes){ 
 
    this.seconds = timeInMinutes * 60; 
 
    this.current = 0; 
 
} 
 

 
Clock.prototype = { 
 
    
 
    constructor: Clock, 
 
    start: function(){ 
 
    var that=this; 
 
     function increase(){ 
 
      if(that.current <= that.seconds){ 
 
       console.log(that.current); 
 
       that.current++; 
 
      } 
 
     } 
 
     setInterval(increase,1000); 
 
    } 
 
} 
 
var clock = new Clock(1); 
 
clock.start();

関連する問題