在名为$ interval的函数中分配值

时间:2015-04-05 09:05:48

标签: angularjs

我很难理解在$ 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正确调用时,我得到了这个意想不到的结果?

1 个答案:

答案 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)