没有箭头函数的 setInterval 函数

IT技术 javascript reactjs setinterval arrow-functions
2021-04-19 03:01:08

我正在按照文档https://facebook.github.io/react/docs/state-and-lifecycle.html了解react组件

为什么这里需要使用箭头函数:

this.timerID = setInterval(() => this.tick(), 1000);

为什么我不能说(显然它不起作用)

this.timerID = setInterval(this.tick(), 1000);
6个回答

的第一个参数setInterval是 类型function如果你这样写:

this.timerID = setInterval(this.tick(), 1000);

...然后你不传递一个函数,而是this.tick立即执行该函数,然后将该函数调用返回的值作为参数传递。

可以这样写:

this.timerID = setInterval(this.tick, 1000);

如果省略括号,则传递对this.tick函数的引用,该函数将setInterval在 1000 毫秒后执行

这个答案是错误的。如果您想避免使用箭头函数,则需要使用绑定,因为tick()调用this.setState. 如果不这样做,它会返回“this.setState is not a function”
2021-05-28 03:01:08
为什么箭头函数可以解决绑定问题?我很想知道啊啊啊
2021-06-05 03:01:08

setInterval 将函数作为第一个参数,在第二种情况下它得到一个返回值

将其更改为

this.timerID = setInterval(this.tick.bind(this), 1000);

或者

 this.timerID = setInterval(() => this.tick(), 1000);

当您想将函数绑定到 React 上下文时,这可能是您所需要的。

请参阅有关为什么需要在 React 中绑定函数的答案

如果你不这样做,你可以简单地写

this.timerID = setInterval(this.tick, 1000);

为什么这里需要使用箭头函数

答案很简单:查看实时脚本示例中的结果...

class Persons{

    scopeOne(){
          // your will see the result this will display our current object 'Persons'
          setInterval(function(){
          
              console.info(' SCOPE ONEo : '+this);
          
          },3000);    
    }
    scopeTwo(){
          setInterval(function(){
          
              console.info(' SCOPE TWO : '+this);
          
          }.bind(this) ,3000);
    }
    
    scopeThree(){
        setInterval(() => { console.info(' SCOPE THREE : '+this) },3000);
    }
}

let p = new Persons();
    p.scopeOne();
    p.scopeTwo();
    p.scopeThree();

在第一个范围中,结果是WINDOW OBJECT,因此我们无法访问我们当前的类范围,因此在第二个范围中,我们将范围与 bind(this) 一起使用,这有助于绑定我们当前的对象范围,在第三个范围中,它与调用当前对象的第二个范围相同....

您需要提供一个函数引用,您正在尝试调用一个函数,除非该函数返回一个函数引用,否则您的代码将无法工作

它应该是这样的

this.tick = function() { .... }

this.timerID = setInterval(this.tick, 1000);

如果您没有使用箭头函数,那么您的代码应该如下所示:

this.timerID = setInterval(function(){ this.tick() }, 1000);