2013-04-23 55 views
0

我有以下功能:爲什麼一些代碼會執行而其他代碼不會?

scroll: function() 
{ 
console.log("scrolling..."); 
this.blockPlacementEnabled = false 
setTimeout(function() 
    { 
    console.log("hello"); 
    this.blockPlacementEnabled = true 
    }, 200); 

}, 

功能完美地運行,並沒有錯誤,但是一旦它到達

this.blockPlacementEnabled =真

該行拒絕運行而代碼繼續,好像我沒有叫 爲什麼有些函數運行,而其他函數不能延遲?

+3

發佈全部代碼 – 2013-04-23 17:37:09

+1

什麼瀏覽器,即沒有控制檯,和那行代碼('console.log(「hello」);')將會出現錯誤,並導致代碼snippit終止。如果它異步運行,你不會看到一個錯誤。 – gbtimmon 2013-04-23 17:37:43

+0

整個項目或整個特定文件? – Jamesp1989 2013-04-23 17:37:44

回答

2

裏面的setTimeout回調,this是指window,而不是它在scroll中引用的對象。這意味着blockPlacementEnabled從未在您的對象中設置爲true

保持到對象的引用:

scroll: function() { 
    console.log("scrolling..."); 
    this.blockPlacementEnabled = false; 

    var self = this; // reference to the current object 
    setTimeout(function() { 
    console.log("hello"); 
    self.blockPlacementEnabled = true; // referencing the current object 
    }, 200); 
}, 

,或者使用.bind[MDN]

Learn more about this

+0

非常感謝felix :)我可以在4分鐘內接受你的答案 – Jamesp1989 2013-04-23 17:46:48

0

您已將該行放入setTimeout,這是異步的。代碼將繼續在正常控制流程中執行(從上到下),在200 ms後,將執行this.blockPlacementEnabled = true

而且因爲一些評論者指出,this指窗口setTimeout,所以你需要一個參考保持這個和使用,在您所設定的超時功能:

scroll: function() 
{ 
    var that = this; 
    console.log("scrolling..."); 
    that.blockPlacementEnabled = false; //<HERE 

    setTimeout(function() 
    { 
     console.log("hello"); 
     that.blockPlacementEnabled = true; //<HERE 
    }, 200); 
}, 
相關問題