2016-03-28 7 views
0

グローバル変数でアプリケーション変数にアクセスしたいjavascriptアプリケーションを作成しています。参照によるJavascriptアクセスメンバー変数

//Initialize 
var myApp=new app(); 

//Count is zero here, as expected since app is asynchronous 
console.log(myApp.count); 

//But 5 seconds later, count should have a non-zero value 
setTimeout(function(){ 
    console.log(myApp.count); 
}, 5000); 

とアプリケーション・コード:

//Application code 
function app() { 

    var count=0; 

    setTimeout(function(){ 
     console.log("Setting count to 10"); 
     count=10; 
    }, 2500); 

    //Member variable for count 
    this.count=count; 
} 

ここjsfiddleを参照してください: https://jsfiddle.net/o4db2ep4/

私が欲しいゼロにするために、カウントの最初のアクセスのためであるが、このような何か2番目の値は10でなければなりません。

私はmyAppを宣言している時点でカウントをゼロ。スコープと組み合わせた値/参照問題によるパスのようなもので、私はこれに苦労しています。

動的なapp.countへの参照を取得するにはどうすればよいですか。つまり、割り当て時の値ではなく、countの現在の値が常に含まれていますか?これが不可能な場合は、この問題をどのように再考すべきですか?

+1

'setTimeout'は、スクリプトを一時停止しません。あなたが提供する関数を後で実行するようにスケジュールするだけなので、 'this.count = count'は' setTimeout'コールバックが始まるずっと前に実行されます。 –

+0

はい、私はこれを理解しています。しかし、app.countがthis.countへのポインタであれば、いつ実行されるかにかかわらず、常に同じ値を参照します。 – jrel

+1

JavaScriptは厳密に値渡し/割り当てです。変数/プロパティは別の変数/プロパティを参照できません。 –

答えて

1

何が起こっているのは、countthis.countが異なる変数であり、魔法のように同期していないということです。一度割り当てたら、それは一度限りのことです。割り当てられたらthis.count=count=0;タイムアウトは更新したいものを、その時点でその後2500msが起こるかthis.count次のとおりです。

function app() { 

    this.count = 0; 

    setTimeout(function(){ 
     console.log("Setting count to 10"); 
     this.count = 10; 
    }.bind(this), 2500); 
} 

あなたは上記を参照できるようあなたが両方の変数を必要としません。

+0

ありがとう、これは役に立ちます。これは真の魔法をやっている.bind(これ)です。これが問題を解決します。しかし、私はそれが何をしているのか分かりません。 – jrel

1

これはどう:

//Initialize 
var myApp=new app(); 
myApp.increment(myApp); 

//Count is zero here, as expected since app is asynchronous 
console.log(myApp.count); 

//But 5 seconds later, count does have a non-zero value 
setTimeout(function(){ 
    console.log(myApp.count); 
}, 5000); 


//Application code 
function app() { 

    this.count=0; 

    this.increment = function(obj) { 
     setTimeout(function(){ 
      console.log("Setting count to 10"); 
      if (typeof(obj.count)=='undefined') { obj.count=0;} 
      obj.count+=10; 
     }, 2500);  
    } 
} 
+0

これはまた役に立ちます、ありがとう。 – jrel

関連する問題