我很难理解在$ interval调用的函数中如何处理值赋值。
给出以下代码:
this.value = null;
this.setSelection = function() {
this.value = Math.floor(Math.random()*11);
};
this.isSelected = function(item) {
if(this.value === item) {
return "selected";
}
};
如果我以这种方式调用setSelection $interval(this.setSelection, 2000);
,则在定义的时间间隔内调用该函数,但是指定值的范围似乎是实际的this.value
未被更改的时间摘要调用isSelected
,值仍为null
。
但是,如果我直接调用该函数(例如这个不正确的表单)$interval(this.setSelection(), 2000);
,则值会正确更新,当摘要运行isSelected
时,它会识别新值。显然,由于$interval
期望函数引用,因此间隔不会再次运行。
我还尝试在匿名函数中包装函数调用,但是这导致了一个错误,指出函数未定义。
所以我的问题是,为什么当我的函数被$ interval正确调用时,我得到了这个意想不到的结果?
答案 0 :(得分:2)
this
取决于具体情况。致电$interval(this.setSelection, 2000)
时,您正在失去this
的背景。该方法被称为函数。当this.value = ...
被执行时,this
与您期望的完全不同(可能是包含的函数)。
解决此问题的一种方法是使用简单的解决方法:
this.value = null;
var self = this;
this.setSelection = function() {
self.value = Math.floor(Math.random()*11);
};
另一种解决方案是将函数绑定到this
:
$interval(this.setSelection.bind(this), 2000)