繁体   English   中英

在 javascript 闭包中使用 setInterval

[英]Using setInterval inside javascript closures

我是 javascript 的新手,目前正在阅读有关关闭的信息。 我试图实现一个例子来更好地理解这个概念。

这是片段:

function getValue() {
  let a = 0

  const runner = async () => {
    a += 1
  }

  setInterval(runner, 100)
  
  return () => {
    return a
  }
}

let value = getValue()
console.log(value()) -----> logging statement 1

// some long operation

console.log(value()) -----> logging statement 2

但是,我看到的 output 是:

1
1

我期望两个日志语句 output 有两个不同的值。 我的理解是,一旦调用getValue()runner程序 function 就会定期执行。 变量a将得到更新,因此第二个console.log应该打印一个递增的a值。

除了错过主要部分外,您几乎就在那里。

操作发生得太快了。 运行第二次迭代不需要 100 毫秒,因此值保持不变。

尝试至少等待 100 毫秒,因为您的时间间隔需要增加该时间量。

如下例所示。

 function getValue() { let a = 0 const runner = async () => { a += 1 } setInterval(runner, 100) return () => { return a } } let value = getValue() console.log(value()) // operations are happening too fast setTimeout(() => console.log(value()), 100); setTimeout(() => console.log(value()), 200); setTimeout(() => console.log(value()), 300);

function getValue() {
  let a = 0

  const runner = () => {
    a += 1
    console.log("Runner's A: " +a)
  }

  setInterval(runner, 100)
  
  return () => {
    return a
  }
}

let value = getValue()
console.log(value());// -----> logging statement 1

// some long operation

console.log(value());// -----> logging statement 2

https://jsbin.com/geponejuba/edit?js,console,output

正如上面所指出的,js是单线程的,所以它的工作方式是,你的日志语句首先执行,如果没有别的事情要做,那么 setTimeout/setInterval 会被执行(这是一个非常简化的语句,你可以阅读详细版本的“事件循环”)

在我分享的示例 jsbin 中,您可以看到 setInterval 被调用并且确实在更新值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM