2011-12-19 24 views
2

私のアプリケーションでは、アプリケーションのさまざまな場所で設定されるいくつかのプロパティを持つオブジェクトがあります。オブジェクトのプロパティへのアクセス

私のプロトタイプ関数の1つには、タイマーを更新する間隔で実行する関数があり、その関数ではthisTimeを設定する必要があります。問題は、これは起こらないということです。その理由は、this.theTimeがオブジェクトではなく関数自体を指しているからです。

以下は、私のコードの2つのバージョンで、いずれも動作しません。私のためのヒント?

// 1. 
function changeTime() { 
    this.theTime = setTime(time); 
    time.setSeconds(time.getSeconds()+1); 
    p1.html(this.theTime); 
} 
interval = setInterval(changeTime(), 1000); 

// 2. 
function changeTime(theTime) { 
    theTime = setTime(time); 
    time.setSeconds(time.getSeconds()+1); 
    p1.html(theTime); 
} 
interval = setInterval(function() { changeTime(this.theTime); }, 1000); 

...

あまりにもそれがより明確に、上記の機能は、タイマーを更新(例えば00:00:01 - 。>00:00:02)毎秒、と私はthis.theTimeは時間で更新することにしたいです。

タイマーが停止すると(別のプロトタイプ関数で発生する)、タイマーが何時に停止したかを確認できますが、今のようにthis.theTimeがデフォルト値です。 objectsプロパティを更新します。代わりに、上記の関数のthis.theTimeはローカル変数でなければなりません。

注:setTime()は、上記の関数と同じプロトタイプ関数内に存在する別の関数です。

+1

「this」はどのように設定する必要がありますか?あなたのコードは動作しませんが、それを修正する方法を正確に言うことは不可能であることは知らないままです。 'this'値は各関数呼び出し時に設定されます。どの機能においても永久に固定されたものではありません。 – Pointy

+0

'setTime()'はあなたが書いた関数か、JS関数 'Date.setTime()'を使用しようとしていますか? –

+0

@JasonCraigもう少し多くのものを整理するためにもう少し質問を編集しました。 –

答えて

1

あなたには、いくつかの機能にこれを使用する正しい方法をご案内しますは、実際に関数が存在するオブジェクトを参照しています。ここで:

function myF() { 
    this.var = 'hey'; 
} 

あなたは(コンストラクタ関数としてMYF)これを使用してvarに到達することができます:

var obj = new myF(); 
alert(obj.var); 

それともここに:

function myF2() { 
    if (typeof this.var === 'undefined') { 
     this.var = 0; 
    } else { 
     this.var += 1; 
    } 
    alert(this.var); 
} 

ここvarは再びmyF2の財産である(これは私が言ったように、JavaScript関数はオブジェクトであるため、単なる関数ではありません)。 myF2を呼び出すたびにthis.varがインクリメントされ、警告されます(最初の呼び出しが初期化される)。

2番目の関数(2番目のsetIntervalで使用される無名関数)では、同じことをしています。

一つの解決策は、あなたが使用する必要はありませんので、どちらの場合も、theTimeをグローバルにすることです:

this.theTime 

だから、結果はこのようなものになります

var theTime = 0, interval; 
function changeTime() { 
    theTime += 1; 
    document.body.innerHTML = theTime; 
    setInterval 
} 

interval = setInterval(changeTime, 1000); 

http://jsfiddle.net/u3EuC/

0

あなたの関数にブレークポイントを設定する

debugger; 

を足すことで容易に確認することができます。それで、あなたの問題を見つけるのはかなり簡単かもしれません。

+0

釣竿ではなく、釣竿ではなく、魚が好きです –

0

thisキーワードに間違いがあることを前提としています。 JavaScriptでthisは少しトリッキーなので、特にsetTimeoutまたはsetIntervalと機能(でそれを使用することは危険である。

は何がやりたいことは、あなたが関数を作成するときthisの値を保存している。

は、ここでより多くの情報です:http://justin.harmonize.fm/index.php/2009/09/an-introduction-to-javascripts-this/

0

たぶん、これらのコメントはまあ

var theTime; // global variable 
function changeTime() { 
    theTime = setTime(time); // theTime is global variable declared above (accesible from anywhere) 
    // var myTime = setTime(time); // myTime is local variable 
    time.setSeconds(time.getSeconds()+1); 
    p1.html(theTime); 
} 
interval = setInterval(changeTime, 1000); // no braces 
+0

'time.getSeconds()'が '60'ならば、' time.setSeconds(61); 'を実行してください –

+0

@Imre L:...は完全にOKです –

+0

回答ありがとうございます。しかし、私はそれを取得していない?あなたのコードでは、関数内で変数 "theTime"を宣言しています。私が他の(プロトタイプ)関数から関数を呼び出そうとしていないとき、その関数にどのように到達することができますか? – holyredbeard

0

ジェイソン、あなたの明確化の後、私はあなたに説明しようとする全く新しい答えを提供する方が良いと信じていますこれは statemeできるだけ良い(単純な)JSとしてnt。私はそれが助けて欲しい

<html> 
<body> 
<div id="output1"></div> 
<div id="output2"></div> 
<script> 
// theTime is undefined in global scope 

function obj(target) { 
    var theTime = 0; 
    var that = this; // var means "private" 
    this.changeTime = function() { // here "this" points to obj and means "public" 
    theTime++; // no var => outer scope = obj scope 
    // here "this" points to changeTime function, not to obj! 
    // "that" points to obj, you may use that.theTime 
    document.getElementById(target).innerHTML = theTime; 
    } 
} 

var o1 = new obj("output1"); 
var o2 = new obj("output2"); 

setInterval(o1.changeTime,1000); // update output1 content every second 
setInterval(o2.changeTime,500); // update output2 content twice a second 
</script> 
</body> 
</html> 
+0

コメントは極端に簡略化されていますので、JSのオタクです。 –