FE-Interview icon indicating copy to clipboard operation
FE-Interview copied to clipboard

Day17:下面代码输出什么?

Open Genzhen opened this issue 4 years ago • 7 comments

for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 1);
}

每日一题会在下午四点在交流群集中讨论,五点小程序中更新答案 欢迎大家在下方发表自己的优质见解 二维码加载失败可点击 小程序二维码

扫描下方二维码,收藏关注,及时获取答案以及详细解析,同时可解锁800+道前端面试题。

Genzhen avatar Jun 22 '20 12:06 Genzhen

答案 0 1 2

解析 使用let关键字声明变量i:使用let(和const)关键字声明的变量是具有块作用域的(块是{}之间的任何东西)。 在每次迭代期间,i将被创建为一个新值,并且每个值都会存在于循环内的块级作用域。

// 下面代码输出什么
for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 1);
}

答案:3 3 3,由于JavaScript中的事件执行机制,setTimeout函数真正被执行时,循环已经走完。 由于第一个循环中的变量i是使用var关键字声明的,因此该值是全局的。 在循环期间,我们每次使用一元运算符++都会将i的值增加1。 因此在第一个例子中,当调用setTimeout函数时,i已经被赋值为3。

Genzhen avatar Jun 22 '20 12:06 Genzhen

意义不大

sweetliquid avatar Nov 04 '20 12:11 sweetliquid

意义不大 @lgwebdream 感谢发表自己的见解

理论的储备还是需要的,不一定每个人都知道这点知识,像在没有 let 之前 这个for 循环还是经常出现在面试题中的

Genzhen avatar Nov 05 '20 02:11 Genzhen

学到了~谢谢

shiaofang avatar Dec 30 '20 06:12 shiaofang

答案 0 1 2

解析 使用let关键字声明变量i:使用let(和const)关键字声明的变量是具有块作用域的(块是{}之间的任何东西)。 在每次迭代期间,i将被创建为一个新值,并且每个值都会存在于循环内的块级作用域。

// 下面代码输出什么
for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 1);
}

答案:3 3 3,由于JavaScript中的事件执行机制,setTimeout函数真正被执行时,循环已经走完。 由于第一个循环中的变量i是使用var关键字声明的,因此该值是全局的。 在循环期间,我们每次使用一元运算符++都会将i的值增加1。 因此在第一个例子中,当调用setTimeout函数时,i已经被赋值为3。

for(var i = 0; i < 3; i++) { setTimeout(console.log(i)) } 这个结果是 0 1 2

webyangpei avatar Mar 03 '21 03:03 webyangpei

也可以用IIFE创建一个新的作用域 for (var i = 0; i < 3; i++) { (function(){ var j = i; setTimeout(() => console.log(j), 1); })() } //0 , 1 , 2

EaVanCN avatar May 24 '21 07:05 EaVanCN

感觉这题应该改成,有几种方式让i 在这题的基础上输出0,1,2。这样会更好

SnailOwO avatar Nov 17 '21 09:11 SnailOwO