代码之家  ›  专栏  ›  技术社区  ›  DannyArcher

JavaScript-当编写一个非常简单的do/while循环时,我的网页无法正确加载

  •  -1
  • DannyArcher  · 技术社区  · 7 年前

    我正在使用do。。。虽然循环,但我的网页似乎没有加载,一旦我附加脚本。以下是代码:

    var x = 45;
    do {
     setTimeout(function(){
      console.log("hello");
    
    }, 3000);
    
    } while (x = 40);
    

    有什么问题?

    顺便说一句,很抱歉这个noob问题,我对JavaScript和编程一般来说都是新手。

    1 回复  |  直到 7 年前
        1
  •  2
  •   moon    7 年前

    问题很简单。当他们对你的问题发表评论时,有一个拼写错误,应该是

    while(x == 40) OR while(x <= 40) OR while(x >= 40)
    

    类似于上面的内容。
    重点是,无论介词中的语句是什么,它都必须返回 在你的特定目的上是真是假 ,并且您还必须确保更改影响语句的值。
    例如,它应该是这样的:

    var x = 10;
    
    do {
     setTimeout(function(){
      console.log("hello");
     }, x * 1000);
    
     x--;
    } while (x >= 1);
    

    然后,该代码将在控制台上连续10秒打印“hello”。然而,您还需要知道这段代码是如何以及为什么这样工作的。

    默认情况下,当broswer读取您的JavaScript文件时,它从最上面的第0行开始
    因此,在该代码中, var x=10 将被读取,然后 稍等片刻 之后开始阅读。如果你的下面还有一个代码 稍等片刻 ,然后在完成阅读后阅读 稍等片刻 . 你了解这个过程吗?

    结论A) 因此,这意味着在浏览器读取您的所有代码之前,您的代码永远不会完成读取。

    其次,您还需要知道setTimeout是如何工作的。基本上,JavaScript是一种单线程编程语言。所以这个语言不支持你同时做很多事情。如果你觉得某件事运行得很快,并且同时完成了,那是因为你的浏览器运行得很快,所以你甚至无法识别延迟。

    当解释器满足异步函数(如setTimeout)时,它将异步任务推送到任务队列中,并 推迟以影响浏览器的结果 或者别的什么地方。
    这意味着:

    -----------------------------Task Queue ↓------------------------------------
    |          (task A) (A's done) (task B) (B's done) (async A) (async A's done)
    |----------------------------Wait Queue ↓------------------------------------
    | task A ---↑  task B(wait)↑---(push)↑
    |     async A(setTimeout:500ms) (wait) ----------(push)↑
    |----------------------------------------------------------------------------
    



    任务A和任务B不是异步函数,因此它们可以在被推入等待队列后立即被推入任务队列,除非任务队列没有被占用。如果任务队列被占用,则所有工作(任务B)必须等待,直到任务队列为空。

    然而,异步函数setTimeout已经在任务B之前的等待队列中推送,但它在任务B之后进入任务队列。 为什么?
    因为这就是异步函数的工作方式。

    结论B) 您设置的参数 并不意味着将执行setTimeout 在里面 秒。它只是意味着 设置超时应该等待多长时间 在等待队列中。

    所以,作为练习,猜猜看为什么这段代码会这样工作。

    var x = 10;
    
    do {
     setTimeout(function(){
      console.log("hello");
     }, x * 1000);
    
     x--;
    } while (x >= 1);
    
    for(i = 0; i< 10000; i++){
     console.log('hi')
    }
    


    最后,代码中的问题是()中的语句。基本上,如果你这样做 而(x=40) ,这意味着您希望将x设置为40,但是因为 虽然 , x=40 将评估并返回true或false。因为x的值不会是假的,所以它总是真的。这就是为什么你 稍等片刻 永远有效。如果你已经很好地阅读了我的帖子,你已经可以解决第二个问题了。因为口译员会留下来 稍等片刻 很好,它无法读取所有代码,也就是说,没有时间执行setTimeout。(记得“推迟”吗?)