let:
1、不能再同一个作用域里重复声明同一个变量。(报错:语法,重复声明)
2、全局作用域中let声明的变量不会自动成为Window对象的属性
3、let声明的变量 用变量提升的,该变量之前成为暂时性死区(变量已在当前的作用域但是不能够进行使用)
4、let声明的变量没有赋值就会报错
5、let声明的变量会让{}()自动成为代码块,全局作用域无法访问
var:
1、能够在同一个作用域里重复声明同一个变量。
2、全局作用域中var的变量会自动成为window对象的属性。
3、var声明的变量存在 变量声明提升,js引擎会把var声明的变量提到最前面 执行到相应代码时进行赋值。
4、var声明的变量没有赋值是undefined
5、var声明的变量不能让{}()生成块级作用域。
const:
1、用来声明变量的 (一般用来声明不会改变的量 如:圆周率、光速、)
2、声明的同时要赋值,否则报错
3、声明的常量如果是原始值则该常量不能被修改,引用值在不修改常量地址的情况下可以修改
1、var声明 for() 中的()不存在块级作用域。
var a = 0;
for (var i = 0; i < 5; i++) {
a += i;
}
console.log(a, i)
let声明 for() 中的()存在块级作用域。
var a = 0;
for (let i = 0; i < 5; i++) {
a += i;
}
console.log(a, i)
2、var 声明的 {}不存在代码块
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i)
}), 0
}
首先是for循环他是可以会很快的执行完的,然后内部定义一个0ms的延迟函数 脱离主线程 在主线程执行完毕后执行这个函数 内部没有i 会向上访问 ,会找全局的i而这个全局的i是for循环结束后的i(i=5),那么就会执行for循环代码在1秒后就打印5次5
let声明的 {}存在代码块
for (let i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i)
}, 0)
}
当延迟的回调函数里面要打印i,现在回调函数是在块级作用域中,这个块级作用域中是没有i的那我会顺着()括号这个块级作用域去找(父级),而父级作用域里面是有i的所以说我找到了,在回调函数打印i的时候其实就找到了()括号作用域里面的i值是0,如此循环反复5圈
回调函数所处环境就是{}号块级作用域内,这个块级作用域所处的环境是()号块级作用域中,所以说就连成一条链。
这个回调函数所处的环境不像var声明的变量了,var是在全局作用域中,但是let声明的变量不一样,let就延长了匿名函数的作用域链,匿名函数所处环境–>{}块级作用域–>()作用域–>全局作用域(这是一条作用域链被延长了)