设置超时内的变量未定义

Variable undefined inside of set timeout

为什么 eta 变量在第一次交互后未定义?我查看了 Closures、Invokable Functions、Binding,但我不确定交易是什么...

var eta = 5400

function runCode() {
  function queryEta(eta) {
    // redo the eta lol
    setTimeout(function() {
      console.log(eta)
      queryEta()
    }, eta);
  }

  queryEta(eta);
}

runCode()

当你在没有任何参数的情况下调用 queryEta() 时,queryEta 中的 eta 参数是未定义的(并且隐藏了顶部定义的参数)

当您创建具有相同名称的 locally-scoped 参数时,您正在重新定义 eta 变量在函数内部的含义。

另外,不要忘记将参数传递给内部函数内部的函数调用。

如果您无法理解范围界定,请查看教程,例如"JavaScript Scope and Closures".

var globalEta = 5400;

function runCode() {
  function queryEta(localEta) {
    setTimeout(function() {
      console.log(localEta)
      queryEta(localEta); // Make sure you pass this in!
    }, localEta);
  }

  queryEta(globalEta);
}

runCode()

您可以访问 window...

var eta = 5400;

function runCode() {
  function queryEta(eta) {
    setTimeout(function() {
      console.log(eta)
      queryEta(eta); // Make sure you pass this in!
    }, eta);
  }

  queryEta(window.eta); // Here!
}

runCode()