let 和 const 理解
打赏作者

citrulluss

##终于等到你

ifwelove

终于等到你 +1

Feyman

小姐姐哪里人

chenxin

声音真是好听!

yin

小姐姐说话好快啊

Osub

小姐姐,定时器设置为0,立即执行,也是10,不是1秒的问题吧

JellyBool 回复 Osub

setTimeout排队在for循环结束后才会执行,不管你设置为多少毫秒。

Yawenina 回复 Osub

setTimeout是在设置的时间之后把函数添加到任务队列当中。但是它的执行时间是要看添加到任务队列时,队列是否为空。如果添加时队列里面还有任务,会把队列里的任务运行完了才会执行。所以setTimeout的时间并不代表执行的时间,而是添加到任务队列的时间

这里你的时间虽然设置为0, 但是队列里还有for循环,所以setTimeout还是在for执行完之后才会执行,这时候i的值还是10。

Osub 回复 Yawenina

✔️✔️✔️✔️✔️✔️

wukongkong 回复 Yawenina

那为什么用了let之后就变成1~10的输出了呢?是不是let声明时候,setTimeout队列插入了10次,每一次for循环执行一次setTimeout呢?

aaronlam 回复 wukongkong

其实循环里不管你用var还是let,setTimeout都会插入任务队列10次。
只是用let后,每次插入任务队列里的setTimeout里的i会按照1-10来输出。

nada 回复 wukongkong

其实这个有很多隐藏的let的知识,而不是用块级作用域解释这么简单,
简单理解应该是这样的

for(let i = 0; i < 10; i++){
  let j = i;
  setTimeout(function(){
    console.log(j)
  }, 0)
}
jonise92

${}能讲下吗?为什么不写成 console.log(‘i’:i); ?

yjx496844026 回复 jonise92

你这样写就是字符串了,不按上面的写也可以写成console.log(‘i:’+i);

jonise92 回复 yjx496844026

这样写会和JQ干扰吗?

jonise92 回复 yjx496844026

已经理解了 谢谢

jishuge

还好没放弃 !

uumyheart

有一个地方不理解,不论是var还是let, setTimeout函数都是在for循环里面那对于i的值来说有什么分别吗,又不是在for外面去访问i的

Yawenina 回复 uumyheart

使用var声明的话,最后执行的setTimeout函数都是获取的全局变量里的i, 获取的是一个地方的i,所以是10.
而使用let声明,每次循环都会给i创建一个新的绑定,相当于每一次都是一个新的i

使用 babel 转译一下可能看的更清楚:

ES6 写法:

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

转译为:

"use strict";

var _loop = function _loop(i) {
	setTimeout(function () {
		console.log(i);
	});
};

for (var i = 0; i < 10; i++) {
	_loop(i);
}
uumyheart 回复 Yawenina

soga,原来是这样,理解了,谢谢耐心解答~~

uxstone 回复 Yawenina

babel转译,很棒,授人以渔

Devins

test (2).html:19 Uncaught ReferenceError: setTimeOut is not defined
for(var i=0;i<10;i++) {
console.log(i);
setTimeOut(function(){
console.log(‘i:${i}’);
},1000)
}

求解为什么报这个错?

Yawenina 回复 Devins

报错信息: setTimeOut is not defined

setTimeout, 这个o是小写。

Young

这位小姐姐说话风格跟果冻很像哎,难道是夫妻店,或者被果冻潜了。。。快跑?