2011-03-30 47 views
0
function a(delay){ 

    this.randomVal = Math.random(); 

    window.setTimeout(function(){ 
     document.write('function a called - '+this.randomVal+' '+delay+'<br/>'); 
    }, delay) 


} 


a(2000); 
a(5000); 
a(1000); 

結果輸出:爲什麼每個單獨調用的函數更新中沒有值?

function a called - 0.7679888338316232 1000 
function a called - 0.7679888338316232 2000 
function a called - 0.7679888338316232 5000 

我敢肯定,這是一個經典的問題,但爲什麼沒有內部功能randomVal「A」更新每次調用的時候..?

回答

3

因爲所有的回調函數有一個參考相同的變量this.randomVal,這是全局對象(window)(thiswindow你的情況)的特性。

所以,你的代碼基本上是一樣的:

function a(delay){ 

    randomVal = Math.random(); 
    // ... 
} 

通過的第一個回調函數被調用的時候,你已經叫a第三次,因此所有的回調函數訪問其設置的this.randomVal值在最後一次通話中。

這可以通過使用var,而是如果this,從而使得它很容易解決的全球一個的局部變量代替:

function a(delay){ 
    var randomVal = Math.random(); 
    window.setTimeout(function(){ 
     document.write('function a called - ' + randomVal + ' ' + delay + '<br/>'); 
    }, delay) 
} 

(請不要使用document.write

1

確實得到更新,正確的時候調用該函數。但延遲後纔會打印該值。第一次打印輸出是在第三次實際調用()之後很長時間發生的,因此它是所有三次調用顯示的成員變量的第三次更新。 Fershtay?

如果您希望它打印三個單獨的值,則不要使用該對象的屬性來保存該值 - 只需將其保存在該函數的本地變量中即可。

3

因爲表達document.write('function a called - '+this.randomVal+' '+delay+'<br/>');實行「後來」,那麼this.randomVal值是this.randomVal = Math.random();

生成的最新值,您可以通過創建一個封閉解決這個問題:

function a(delay){ 

    var randomVal = Math.random(); 

    window.setTimeout(function(){ 
     document.write('function a called - '+randomVal+' '+delay+'<br/>'); 
    }, delay) 
} 
相關問題