首页 > 试题广场 >

下面代码的运行结果是

[单选题]
下面代码的运行结果是

  • 1,2,3
  • 1,1,1
  • 4,4,4
  • 3,3,3
这道题答案错了,我运行了一遍,应该选c
发表于 2018-02-14 21:04:02 回复(1)
答案选C。
先说说代码运行的结果4的来源,这个循环的运行结果是i不再小于4,条件首次成立时i=4,因此输出结果为循环结束时i的最终值。
再说说为什么会输出三个4,延迟函数的回调会在循环条件结束时再执行,即使定时器执行的是setTimeout(..., 0),因此会每次输出一个4来。

追究问题的本质原因,尽管循环中的三个函数是在各个迭代中独立定义的,但他们都被封闭在一个共享作用域中,故而实际上只有一个i。ES6中的let声明会劫持块级作用域,for循环的let声明会在每次迭代时进行变量声明,随后每个迭代都会用上一次循环结束的值来初始化i,这样迭代的结果就是1,2,3了。
for(let i=1; i<4; i++) {
  setTimeout(()=>console.log(i), 0);
}
//1 2 3


发表于 2018-03-07 13:47:24 回复(0)
如果使用let定义i,结果为1,2,3

如果使用var定义i,结果为4,4,4,
编辑于 2018-03-07 11:00:21 回复(1)
for(var i=0;i<4;i++){
    setTimeout(function(){console.log(i)},0)
}
1724
4VM35568:2 4

发表于 2018-03-13 14:03:08 回复(0)
发表于 2018-02-26 19:23:38 回复(0)
发表于 2018-02-26 17:02:23 回复(0)
发表于 2018-02-26 10:48:08 回复(0)
不用想都是选C呀。。。老题目了
发表于 2018-02-25 12:46:44 回复(0)
用let声明的是333,var的是4
发表于 2018-02-24 22:10:02 回复(3)
我做出来是一个4
发表于 2018-02-24 14:43:24 回复(0)
ゞ头像
答案应该是c吧
发表于 2018-02-23 11:53:03 回复(0)
我觉得是3个4?
发表于 2018-02-14 17:07:50 回复(2)