2016-03-28 100 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/

我想要的是用於計數的第一次訪問是零,但第二個應該是10.

我認爲發生的事情是,當我聲明myApp時,它獲得count的值爲零。這就像一個價值/參考問題與範圍相結合的傳遞,我正在爲此付出努力。

如何獲得對動態的app.count的引用,即始終包含count的當前值,而不是賦值時的值?如果這不可能,我該如何重新考慮這個問題?

+1

'setTimeout'不會暫停腳本。它只是調度你提供的函數以便稍後運行,所以'this.count = count'在'setTimeout'回調執行之前就已經執行了。 – 2016-03-28 02:10:19

+0

是的,我明白這一點。但是如果app.count是一個指向this.count的指針,那麼無論何時運行,它們都會一直引用相同的值。 – jrel

+1

JavaScript嚴格按價值傳遞/分配。一個變量/屬性不能引用另一個變量/屬性。 –

回答

1

發生什麼事是countthis.count是不同的變量,他們並不神奇地同步。一旦你分配它,這是一次性的事情。當它被分配到this.count=count=0;此後此時要更新什麼是this.count超時會發生在2500ms:

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