• 几道好玩的JS题目,看看你能答中几道。


    1,for (var i = 0; i < 5; i++) {

      console.log(i);

      }

    这几行代码会输出什么?

    输出 0 1 2 3 4

    2,for (var i = 0; i < 5; i++) {

      setTimeout(function() {

      console.log(i);

      }, 1000 * i);

      }

    会输出什么?

    输出5次5

    3,那应该怎么改才能把上面的代码输出 0 到 4 呢?加个闭包函数即可

      for (var i = 0; i < 5; i++) {

      (function(i) {

      setTimeout(function() {

      console.log(i);

      }, i * 1000);

      })(i);

      }

    4,把i 去掉会输出什么?

      for (var i = 0; i < 5; i++) {

      (function() {

      setTimeout(function() {

      console.log(i);

      }, i * 1000);

      })(i);

      }

    这样子的话,内部其实没有对 i 保持引用,其实会变成输出 5次5。

    6,再改成这样,会输出什么?

    for (var i = 0; i < 5; i++) {

      setTimeout((function(i) {

      console.log(i);

      })(i),i * 1000);

      }

    应该是立马输出 0 到 4 

    7,setTimeout(function() {

      console.log(1)

      }, 0);

      new Promise(function executor(resolve) {

      console.log(2);

      for( var i=0 ; i<10000 ; i++ ) {

      i == 9999 && resolve();

      } console.log(3);

      }).then(function() {

      console.log(4);

      }); console.log(5);

    这道题应该考察我 JavaScript 的运行机制的,让我理一下思路。

    首先先碰到一个 setTimeout,于是会先设置一个定时,在定时结束后将传递这个函数放到任务队列里面,因此开始肯定不会输出 1 。

    然后是一个 Promise,里面的函数是直接执行的,因此应该直接输出 2 3 。

    然后,Promise 的 then 应当会放到当前 tick 的最后,但是还是在当前 tick 中。

    因此,应当先输出 5,然后再输出 4 。

    最后在到下一个 tick,就是 1 。

    “2 3 5 4 1”

  • 相关阅读:
    Python multiprocessing相关疑问
    Tornado demo3
    WebSockets
    Tornado Demo1---webspider分析
    Python assert断言
    Python学习之--数据基础
    Python学习之--python概要
    Python学习之--函数/生成器/装饰器
    Python学习之文件操作
    Python操作MySQL数据库
  • 原文地址:https://www.cnblogs.com/lvqiupingboke-2019/p/12090742.html
Copyright © 2020-2023  润新知