setTimeout函数参数未定义(JS)

setTimeout function parameters undefined (JS)

我找不到合适的解释。

function subtract(x, y) {
    setTimeout(function(x, y) {
      document.write(x - y);
  }, 1000);
}

subtract(1, 1);

这会将 NaN 写入文档,因为传递给 setTimeout 的 x 和 y 参数未定义。你会认为 x 和 y 应该是整数 1 并且它在减法函数的范围内。以下代码段工作得很好,并按预期写入整数 0:

function subtract(x, y) {
    setTimeout(function() {
      document.write(x - y);
  }, 1000);
}

subtract(1, 1);

删除参数似乎可以解决问题。为什么?

你没有传递参数给回调函数,当回调最终被setTimeout调用时,xyundefined

所以你看到 NaN 作为输出,因为 undefined - undefinedNaN

setTimeout 接受您在 delay 参数之后传递的函数回调的参数,在您的例子中是在 1000 之后。

在不传递参数的情况下,xy 变量的范围限定为函数回调。它不会从外部范围获取值,因为它被您提供的函数参数遮蔽了。

function subtract(x, y) {
    setTimeout(function(x, y) {
      document.write(x - y);
  }, 1000, 1, 1);
}

subtract(1, 1);

您也可以使用Function.prototype.bind将参数传递给回调函数。

bindthis 上下文作为第一个参数,其余参数是函数的参数。在我的示例中,我将 null 作为 this 上下文:

function subtract(x, y) {
    setTimeout(function(x, y) {
      document.write(x - y);
  }.bind(null,1,1), 500);
}

subtract(1, 1);

这是一个 javascript 参考问题 https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout

在 -- "this" 问题部分他们提到了同样的问题

这是因为闭包、异步函数和执行上下文。 settimeout 是异步函数,意味着它不会等待或阻止执行。 Settimeout 函数由 eventloop tick 执行。 当您不将参数传递给其中的函数时,它将包含减法函数的值并将其存储以在执行时使用。这是因为闭包的概念。 如果我们传递参数,它不再表现得像一个闭包,并且在执行时期望参数为 null。所以你得到 NaN。 对于实验,将默认参数传递给 settimeout 中的函数并检查。