Javascript React JS-为什么这个变量的行为像一个函数?

Javascript React JS-为什么这个变量的行为像一个函数?,javascript,reactjs,Javascript,Reactjs,我创建了一个倒计时计时器,但无法使用clearInterval清除间隔。我最终使setInterval函数位于变量内部,然后将该变量作为参数传递到clearInterval中。我不明白的是为什么要首先调用setInterval函数,因为我所做的只是创建一个变量。变量内部的函数是否自动运行?你不需要以某种方式调用它们吗?如果它在一个变量中,你怎么调用它?。下面是有效的代码,但我不明白为什么: myFunct () { const intervals = setInterval(() =>

我创建了一个倒计时计时器,但无法使用clearInterval清除间隔。我最终使setInterval函数位于变量内部,然后将该变量作为参数传递到clearInterval中。我不明白的是为什么要首先调用setInterval函数,因为我所做的只是创建一个变量。变量内部的函数是否自动运行?你不需要以某种方式调用它们吗?如果它在一个变量中,你怎么调用它?。下面是有效的代码,但我不明白为什么:

myFunct () {
  const intervals = setInterval(() => {
    if(this.state.time > 0) {
      this.setState({ time: this.state.time-1 })
    }
    else {
      clearInterval(intervals);
    }
  }, 1000);
}
这是setInterval的签名:

此函数返回一个数字,表示设置的计时器的ID值。此数字可以传递到window.clearInterval以清除计时器。所以当你这样称呼它的时候:

const myInterval = setInterval(myCallback, 1000);
myInterval现在是正在运行的计时器的编号ID。如果myCallback调用clearIntervalmyInterval,它将清除计时器


变量内部-什么?setInterval函数在调用时返回一个值,该值是您必须传递给clearInterval的值。@Pointy但setInterval在const Interval=内。如果我只是创建一个可变间隔,在这种情况下,为什么我设置它等于被调用?我想你误解了一些基本的东西,但我不确定到底是什么。您的代码正在调用一个名为setInterval的方法,并将该方法返回的值分配给变量Interval。方法setInterval除了返回一个值外,还将设置一个interval并开始运行它。这个过程有什么特别让您感到困惑的地方?您将它设置为一个变量,这意味着在运行myFunct时会自动调用它。如果不希望运行间隔,请将其写入函数:const interval==>setInterval@Hamms谢谢你的回复。我想当我刚刚设置一个新变量时,触发整个倒计时似乎很奇怪。我想我已经习惯于创建变量来保存函数中使用的字符串或整数。谢谢你的回复。我想我一开始并不希望调用setInterval,因为我只是在设置一个新变量。我想我必须在其他地方引入'myInterval'才能调用它——这没有意义,因为它是一个变量。现在我明白了,即使我只是声明了一个变量,我将它设置为等于的任何函数都会被当场调用。这是正确的吗?变量的声明与函数调用无关。在本例中,如果调用setIntervalcallback,delay,但左侧没有变量,则只会丢弃返回值。通过定义变量,您为该变量指定了返回值。如果调用的函数不返回任何内容,则左侧的变量将变为未定义。如果您想存储一个函数而不调用,那么它是const intervalFn=setInterval。然后你可以像调用setInterval一样调用intervalFn,但那是没有用的。我曾经认为,如果在左边有一个变量,程序实际上不会运行setInterval,因为组件实际上不会在页面上更新。显然,它确实在运行。我仍在学习,我感谢你的帮助性回答。@Grip试着读一下表达式和语句之间的区别。尽管在JavaScript中分号是可选的,但它们通常用于结束语句。语句不返回或具有值。例如常数a=1+3;是一个语句,为什么1+3是一个表达式。函数调用是一个表达式,它要么返回值,要么返回未定义的值,要么返回null。这绝对是一个需要理解的重要概念。我会确保我完全理解它,这样我就不会陷入另一种情况。再次感谢你抽出时间来帮助我。多棒的社区啊。
const myInterval = setInterval(myCallback, 1000);