首先var
,let
,const
都是用于定义变量,这是它们的共同点,那么它们的区别呢?
其实还可以什么都不用,直接给变量赋值,这样的话,就是赋值给了全局对象(在浏览器上就是 window 对象):
1 | a = 1; |
var 可以提升作用域,var 的作用域在闭包内
一下代码不会报错,即便声明 a 在用到 a 后面:
1 | console.log(a, b, c); |
加一个块级作用域,var 依旧不会报错:
1 | console.log(a, b, c); |
而且 let 和 const 是块级作用域,写成这样也会报错:
1 | { |
var 无法跨闭包,报错:
1 | function a() { |
通过 var 声明的所有全局变量和函数都会变成 window 对象的属性和方法,而 let 和 const 不会
1 | var a = 1; |
一个经典的坑
1 | for (var i = 0; i < 6; i++) { |
使用 let 可以避免此问题:
1 | for (let i = 0; i < 6; i++) { |
也可以用闭包来解决此问题,let 是 es6 引进的,实际上在 es5 一般就是用闭包来解决问题:
1 | function fn(i) { |
顺带说一下 js 怎么实现 sleep,用 setTimeout 和 Promise 可以实现
1 | function sleep(time) { |
不过 setTimeout 其实的 sleep 秒数不太准确,它要等所有的微任务都做完,如果微任务很长的话,就要多等一会儿了。
1 | function costManyTime() { |