Javascript绑定问题
Javascript Binding Issue
这段代码让我很困惑:
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();
原因是JavaScript的this
是动态的。当您调用如下函数时:
object.func();
this
设置为object
。但是,当您简单地调用函数时:
func();
或者将其传递给其他一些函数(包括setInterval
), this
将被设置为全局对象(通常是window
)。
因此,当您将self.tick
传递给setInterval
时,tick
中的this
将是全局对象,而不是timer
。当您通过function() { self.tick(); }
时,它是self
(timer
)。
在这里,没有区别,因为tick
不访问this
,但如果tick
访问this
,您可能想要使用function() { self.tick(); }
,因为否则,您将修改全局对象的属性,而不是timer
。
function(){self.tick();}
比self.tick
更容易扩展。这有点像在只包含一条语句的if
块周围使用(或不使用)花括号的区别。
我们使用:window.setInterval(function(){self.tick();}, 1000)
的另一个原因是符合"单一职责"的设计原则。Tick()应该只做一项工作:Tick。如果在计时器触发时需要执行更多的任务,则应该编写另一个函数并在事件处理程序中调用它,而不是修改tick()。例如:
window.setInterval(function(){
self.tick();
self.notify();
.....
}, 1000)
相关文章:
- ng绑定和ng href问题.ng href未从控制器加载数据
- 绑定的角度ng-max问题
- 性能问题:通用选择器与单独绑定
- 使用AngularJS UI路由器时出现元素绑定问题
- 数据互绑定问题:转换器只运行一次,无法绑定元素的 ID
- 挖空和显示模块模式的数据绑定问题
- 使用大括号的 Internet Explorer 上的 AngularJS 数据绑定问题
- backbone.js绑定问题
- SAPUI5绑定问题:json文件中维护的列表项链接不起作用
- 绑定的Javascript问题
- 将事件绑定到Bootstrap 3(button.js)按钮无线电时出现问题
- 将javascript绑定到提交按钮时出现问题
- Aurelia类的问题.使用checked.bind绑定
- AngularJS:图片上传+文件阅读器预览.控制器、指令和作用域之间的绑定出现问题
- 挖空 - 单击绑定到对象函数 - 范围问题
- Angular JS(嵌套变量)中的绑定问题
- 触摸事件的挖空事件绑定导致滚动问题
- JavaScript setInterval 范围问题:绑定的替代方案
- 击倒剑道问题绑定通过计算观察
- 奇怪的问题绑定事件与骨干,“;这个“;没有更新