Javascript 初始化前如何访问timeoutID?

Javascript 初始化前如何访问timeoutID?,javascript,Javascript,函数addNew(){ let id=setTimeout(函数(){console.log(id)},0) } addNew()参见示例,希望您理解 函数addNew(){ let id=setTimeout(//尚未初始化的变量不能被一行直接引用,该行在变量初始化之前运行(let id=行),但对于尚未调用的函数,仍然允许引用其中的变量 在第一个代码段中,setTimeout回调直到let id=行完成对id变量的初始化后才会运行,因此这是允许的 在第二个代码段中,传递给customTim

函数addNew(){
let id=setTimeout(函数(){console.log(id)},0)
}

addNew()
参见示例,希望您理解

函数addNew(){

let id=setTimeout(//尚未初始化的变量不能被一行直接引用,该行在变量初始化之前运行(
let id=
行),但对于尚未调用的函数,仍然允许引用其中的变量

在第一个代码段中,
setTimeout
回调直到
let id=
行完成对
id
变量的初始化后才会运行,因此这是允许的

在第二个代码段中,传递给
customTimeout
的回调在
addNew
中的
let id=
行完成初始化
id
之前运行,因此这是不允许的

//允许:
常数fn=()=>{
//用一些变量做点什么
console.log(someVariable);
};
//以上是好的
让someVariable='foo';
//只需确保fn仅在'let someVariable;'运行之后调用即可

fn();
当您调用
setTimeout
(即使超时值为
0
)时,回调不会立即运行。它被放入堆栈中,以便在将来某个时候运行

因此,在第一个示例中,您将
id
设置为
setTimeout
返回的“timeoutID”。当将来(异步)运行回调时,
id
在那里,回调可以看到它

在第二个示例中,您将回调传递给
customTimeout
。在该函数返回任何内容之前,将运行回调。它将立即(同步)运行,在回调运行之后,然后
customTimeout
返回一个值


由于此值是在函数运行后返回的,因此函数无法看到它。

我仍然不明白。id是何时初始化的?setTimeout的行为是否可以由自定义编写的函数复制?变量在其行运行时初始化,就在可能的
=
右边的任何内容运行之后。
const foo=someExpression初始化
foo
(允许在运行的行中引用)一旦
someExpression
完成对值的求值。
setTimeout
是浏览器提供的API-它不是您可以自己实现的。但要复制问题并查看不同的可能性,您可以将回调保存在变量中,然后在变量引用之前或之后调用函数回调内部的enced已初始化-与最后的代码段一样。我仍然不明白您能否提供一个重写customTimeout函数的代码段,以便它的行为与我的第一个代码段中的setTimeout相同?我确实理解您回答中的代码段,但我不明白我的第一个和第二个代码段是如何执行的de snippets是完全不同的。我认为这里混淆的基础在于
setTimeout
调用的性质。它不是阻塞,只是被调用,它将其参数放入任务队列,并返回结果,即超时id。然后
addNew
函数,脚本的其余部分继续执行。在所有脚本之后重新完成后,任务队列将触发timed函数。此时,
id
变量很久以前就得到了它的值。JS只有一个线程,所有操作都在该线程上执行,甚至异步调用计时器。