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
调用时,x
和y
是undefined
。
所以你看到 NaN
作为输出,因为 undefined - undefined
是 NaN
。
setTimeout
接受您在 delay
参数之后传递的函数回调的参数,在您的例子中是在 1000
之后。
在不传递参数的情况下,x
和 y
变量的范围限定为函数回调。它不会从外部范围获取值,因为它被您提供的函数参数遮蔽了。
function subtract(x, y) {
setTimeout(function(x, y) {
document.write(x - y);
}, 1000, 1, 1);
}
subtract(1, 1);
您也可以使用Function.prototype.bind
将参数传递给回调函数。
bind
将 this
上下文作为第一个参数,其余参数是函数的参数。在我的示例中,我将 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 中的函数并检查。
我找不到合适的解释。
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
调用时,x
和y
是undefined
。
所以你看到 NaN
作为输出,因为 undefined - undefined
是 NaN
。
setTimeout
接受您在 delay
参数之后传递的函数回调的参数,在您的例子中是在 1000
之后。
在不传递参数的情况下,x
和 y
变量的范围限定为函数回调。它不会从外部范围获取值,因为它被您提供的函数参数遮蔽了。
function subtract(x, y) {
setTimeout(function(x, y) {
document.write(x - y);
}, 1000, 1, 1);
}
subtract(1, 1);
您也可以使用Function.prototype.bind
将参数传递给回调函数。
bind
将 this
上下文作为第一个参数,其余参数是函数的参数。在我的示例中,我将 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 中的函数并检查。