Javascript覆盖setTimeout anon函数内的变量

Javascript覆盖setTimeout anon函数内的变量,javascript,jquery,global-variables,settimeout,Javascript,Jquery,Global Variables,Settimeout,我试图在函数中使用全局变量覆盖一个变量,但是,它似乎不起作用,我也不知道为什么 我希望test2中的最终结果记录为“after”。它当前正在“之前”记录 如果我删除setTimeout,它就可以工作,但是,我需要在代码中添加setTimeout var jeff=“before”; 功能测试(){ setTimeout(函数(){ 杰夫=“之后”; test(); }, 1000); } test(); 函数test2(){ console.log(杰夫); } test2()根据注释,代码不

我试图在函数中使用全局变量覆盖一个变量,但是,它似乎不起作用,我也不知道为什么

我希望test2中的最终结果记录为“after”。它当前正在“之前”记录

如果我删除setTimeout,它就可以工作,但是,我需要在代码中添加setTimeout

var jeff=“before”;
功能测试(){
setTimeout(函数(){
杰夫=“之后”;
test();
}, 1000);
}
test();
函数test2(){
console.log(杰夫);
}

test2()根据注释,代码不等待,它异步运行

您有两种选择:

1) 在
test2()
函数中使用
setTimeout
,如下所示:

function test2() {
   setTimeout(function() {
       console.log(jeff);
   }, 1000);
}
setTimeout(function() {
   console.log(jeff);
}, 1000);
2) 或者在调用
test2()
时使用
setTimeout
,如下所示:

function test2() {
   setTimeout(function() {
       console.log(jeff);
   }, 1000);
}
setTimeout(function() {
   console.log(jeff);
}, 1000);

这两个函数的作用完全相同…

使其工作的唯一方法是在超时期间或之后使
console.log
或调用
console.log
的函数发生

例如:

var jeff=“before”;
功能测试(){
setTimeout(函数(){
杰夫=“之后”;
test2();
}, 1000);
}
test();
函数test2(){
console.log(杰夫);
}

正如评论者所指出的,setTimeout会导致该代码块(setTimeout回调函数)异步运行,这意味着主“线程”(很抱歉,如果这里不是正确的术语)在没有它的情况下继续运行,这在您的情况下是执行
test1()
test2()
。显然,所有这些都发生在不到1000毫秒的时间内,所以您的全局变量仍然是“before”

但是,这里还有更多问题:尝试将超时更改为0。你会注意到它仍然不起作用。这是因为异步代码在有机会执行之前必须在队列中等待。主“线程”在没有它的情况下仍将继续运行,因为在setTimeout中运行代码似乎有两个条件:1。指定的毫秒必须已过,并且为2。线程/堆栈/对象不应该很忙。如果在时间结束时它很忙,那么您的代码仍然必须等待事件循环在另一个空闲时间返回来执行该代码


如果技术术语不准确,很抱歉。我认为从概念上来说,这应该是非常有帮助的。下面是一段精彩的视频,可以让您深入了解:

因为它是异步的。。。。代码不会等到setTimeout运行时才执行。。。。基本上你点了一个比萨饼,一挂上电话你就试着吃比萨饼。它还没有被制作和交付。因为它一秒钟都没有准备好,但是你马上就给它打电话了。在阅读了评论之后,我自己就这样把它修好了。不知道我怎么会错过这个,老实说,我现在应该上床睡觉了,哈哈。谢谢