这是我用来使用window.setinterval增加intVariable值的代码。
var Arrow = (function () {
function Arrow() {
this.intVariable = 1;
this.itemId = -1;
this.interval = 25;
}
Arrow.prototype.activateTimer = function () {
if (this.itemId === -1) {
window.setInterval(this.showTimer(), this.interval);
}
};
Arrow.prototype.showTimer = function () {
this.intVariable += this.interval;
console.log(this.intVariable);
};
return Arrow;
}());
var arrow = new Arrow();
arrow.activateTimer();

当我使用下面的行时,show timer函数只被调用一次
window.setInterval(this.showTimer(), this.interval);
但是当我把它改为:
window.setInterval(() => this.showTimer(), this.interval);
效果很好。
需要一些帮助,为什么它使用箭头功能。
答案 0 :(得分:2)
您可以直接使用函数引用(不使用括号)
window.setInterval(this.showTimer, this.interval);
通过使用函数调用,
window.setInterval(this.showTimer(), this.interval);
// ^^
插入函数调用的结果而不是函数本身。
使用时
window.setInterval(() => this.showTimer(), this.interval);
插入一个函数而不实际调用它。
答案 1 :(得分:1)
你应该为间隔提供功能,而不是功能的返回。
每当你写window.setInterval(this.showTimer(), this.interval);
其实你这样做
var returnValue = (function () {
this.intVariable += this.interval;
console.log(this.intVariable); // You get your log for once
})() // -> null
window.setInterval(returnValue/*null*/, this.interval);
然后setInterval
尝试在每个null
之后调用this.interval
,这不会在控制台上出现错误。
但是当你用箭头() => this.showTimer()
来调用它时,这意味着:
var returnValue = function() {
this.showTimer();
} // -> Function
window.setInterval(returnValue/*Function*/, this.interval);
您正在为间隔提供功能。
此外,如果您忘记将功能绑定到this
范围,您将无法访问箭头范围。因此,您可能会看到很多NaN
s
setInterval
尝试使用window
的全局范围调用您的注册函数。因此,当您在函数中编写this
时,this
将window
作为this.intVariable
。因此,每当您尝试记录window.intVariable
时,它都会尝试记录未定义的this
。
所以我们应该将函数绑定到当前对象范围。因此,无论何时使用intVariable
,您的范围都将绑定到当前对象(箭头)。你得到当前的箭头() =>
。
但无论何时编写 var Arrow = (function () {
function Arrow() {
this.intVariable = 1;
this.itemId = -1;
this.interval = 25;
}
Arrow.prototype.showTimer = function () {
this.intVariable += this.interval;
console.log(this.intVariable);
};
Arrow.prototype.activateTimer = function () {
if (this.itemId === -1) {
window.setInterval(this.showTimer.bind(this), this.interval);
}
};
return Arrow;
}());
var arrow = new Arrow();
arrow.activateTimer();
,您都会创建如上所述的匿名函数,并且已将其范围连接到对象中。所以你不需要额外的绑定。
这是您的解决方案
private Service service;
private System system;
@BeforeMethod
public void setupMocks() throws Exception {
service = powerMock.mock(Service.class);
system = powerMock.mock(System.class);
}
public void sample_Test() {
PowerMockito.doReturn(system).when(service, "getValidatedDto",
Matchers.any(Long.class), Matchers.any(Date.class));
// some code
}
这是fiddle
答案 2 :(得分:0)
window.setInterval(() => this.showTimer(), this.interval);
就像
window.setInterval(function() {this.showTimer()}, this.interval);
window.setInterval(this.showTimer(), this.interval);
无法正常工作,因为您只需要传递this.showTimer
,但是您正在快速调用它