我正在尝试使用函数中的全局变量来覆盖变量,但是,它似乎无法正常工作,我也不知道为什么。
我希望test2中的最终结果记录为“之后”。当前正在“之前”记录。
但是,如果删除setTimeout可以正常工作,则我需要在代码中使用setTimeout。
var jeff = "before";
function test() {
setTimeout(function() {
jeff = "after";
test();
}, 1000);
}
test();
function test2() {
console.log(jeff);
}
test2();
谢谢!
答案 0 :(得分:0)
按照评论说,代码不会等待,它会异步运行。
您有2个选择:
1)在setTimeout
函数中使用test2()
,如下所示:
function test2() {
setTimeout(function() {
console.log(jeff);
}, 1000);
}
2)或在呼叫setTimeout
时使用test2()
,就像这样:
setTimeout(function() {
console.log(jeff);
}, 1000);
这两者的作用完全相同...
答案 1 :(得分:0)
要使其正常工作,唯一的方法是使console.log
或调用console.log
的函数在超时期间或之后发生。
例如:
var jeff = "before";
function test() {
setTimeout(function() {
jeff = "after";
test2();
}, 1000);
}
test();
function test2() {
console.log(jeff);
}
答案 2 :(得分:0)
正如评论者所指出的那样,setTimeout导致该代码块(setTimeout回调函数)异步运行,这意味着主“线程”(抱歉,如果此处不是正确的术语)将继续运行,而无需它,您的情况是执行test1()
和test2()
。显然,所有这些操作都在不到1000毫秒的时间内发生,因此您的全局变量仍在“之前”。
但是,这里还有更多事情:尝试将超时更改为0。您会注意到它仍然不起作用。这是因为异步代码必须在队列中等待才有机会执行。没有它,主“线程”仍将继续运行,因为好像在该setTimeout中有两个运行代码的条件:1.必须经过指定的毫秒数;和2.线程/堆栈/事物不应繁忙。如果时间到了,它仍然很忙,那么您的代码仍将不得不等待,直到事件循环再次释放,再有空余时间来执行该代码。
很抱歉,如果技术术语不准确。我认为从概念上讲应该很有帮助。这是一个出色的视频,可以让您深入了解:https://youtu.be/cCOL7MC4Pl0