迷惑箭头功能javascript

时间:2017-07-31 06:48:50

标签: javascript typescript

这是我用来使用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);

效果很好。

需要一些帮助,为什么它使用箭头功能。

3 个答案:

答案 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时,thiswindow作为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,但是您正在快速调用它