这是让我感到困惑的代码片段:
var timer =
{
start: function()
{
var self = this;
/*Why the code below doesn't write to this:
window.setInterval(self.tick, 1000).*/
//Instead, it embedded into a function like this:
window.setInterval(function(){self.tick();}, 1000)
},
tick: function()
{
console.log("tick!");
}
}
timer.start();
答案 0 :(得分:2)
原因是JavaScript的this
是动态的。当您调用如下函数时:
object.func();
this
将设置为object
。但是,当您明确地调用函数时:
func();
或者将其传递给许多其他函数(包括setInterval
),this
将被设置为全局对象(通常为window
)。
因此,当您将self.tick
传递给setInterval
时,this
内的tick
将成为全局对象,而不是timer
。当您通过function() { self.tick(); }
时,它是self
(timer
)。
此处没有区别,因为tick
无法访问this
,但如果tick
访问this
,您可能希望使用function() { self.tick(); }
},否则,您将修改全局对象的属性,而不是timer
。
答案 1 :(得分:1)
function(){self.tick();}
比self.tick
更容易扩展。这有点像在仅包含一个语句的if
块周围使用花括号(或不使用)之间的区别。
答案 2 :(得分:0)
我们使用的另一个原因:window.setInterval(function(){self.tick();}, 1000)
符合“单一责任”设计原则。 tick()应该只做1个工作:tick。如果你需要在计时器触发时做更多的工作,你应该编写另一个函数并在事件处理程序中调用它而不是修改tick()。例如:
window.setInterval(function(){
self.tick();
self.notify();
.....
}, 1000)