Javascript覆盖setTimeout anon函数内部的变量

时间:2018-07-26 00:44:43

标签: javascript jquery global-variables settimeout

我正在尝试使用函数中的全局变量来覆盖变量,但是,它似乎无法正常工作,我也不知道为什么。

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

但是,如果删除setTimeout可以正常工作,则我需要在代码中使用setTimeout。

var jeff = "before";

function test() {
  setTimeout(function() {
    jeff = "after";
    test();
  }, 1000);
}

test();

function test2() {
  console.log(jeff);
}

test2();

谢谢!

3 个答案:

答案 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