首页 > 试题广场 >

以下 Javascript 代码的运行结果是() var j

[单选题]
以下 Javascript 代码的运行结果是()
var j = 0;
for (let i = 0; i < 2; i++, j++) {
  setTimeout(function() {
    console.log(i, j);
  }, 1000);
}

  • 0 0, 1 1
  •  0 2, 1 2
  •  2 2, 2 2
  • 1 1, 1 1

知识点1:

let是块级作用域、var是函数级作用域,

知识点2

setTimeout(func,time)函数,延迟运行函数.将func函数添加到“执行队列”中,当主程序完成后,再按照执行队列运行.
对于这道题,for循环会先执行完,然后再根据time执行
    console.log(i, j);
注意:此时执行队列中var变量会延续循环后所变更的var值,也就是2;let变量会被绑定到对应的闭包函数(setTimeout中的func)中

知识点3

在js中使用setTimeout和for参考:
发表于 2020-02-20 18:01:23 回复(0)
1)setTimeout()是一个异步处理函数,它会等待所有的主线程任务处理完,才开始执行自己的内部的任务,每隔1s往任务队列中添加一个任务【闭包函数,setTimeout()中的函数,现在还没执行】

2)let是块极作用域,每次for循环都会把对应的i绑定到添加的任务【闭包函数,setTimeout()中的函数】中,所以当主线程执行完时,也不会影响到每个任务中i。所以可以打印出0   1 
发表于 2020-03-01 14:48:43 回复(0)
var和let的区别,let的每一次结果不会覆盖前面的结果所以每一个i对应一个console.log,一对一的关系
而var里面的j是拿到最后的结果答应2,多个console.log对应一个j。
发表于 2020-01-23 13:55:45 回复(0)
i是由let定义的,是块级作用域,因此每次循环都会绑定一个不同的i值,而j是var定义的,会形成闭包,因此输出的是最终的j值
发表于 2020-04-05 23:18:41 回复(0)