2013-04-23 53 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); 
}, 
相关问题