块级作用域
let 声明
- 函数内部
- 块中(字符{}之间的区域)
- 禁止重申明: 同一作用域中不能用let重复定义已经存在的标识符。但如果当前作用域内嵌另一个作用域,便可在内嵌的作用域中用let声明同名变量
let num = 1;
if(true){
let num = 2;
}
const 声明
一般使用这个命令声明常量,值一旦被设定后就不可更改。但是当声明的是一个对象时,是可以修改内部的值的,也就是说,const声明不允许修改绑定,但是可以修改绑定的值
全局块作用域绑定
之前使用var声明变量时,它会创建一个新的全局变量作为全局对象(也就是window的属性),这就会造成无意中覆盖已经存在的全局属性,例如下面:
var RegExp = 'str';
console.log(window.RegExp) // 'str'
但是现在有了let和const,这两个命令会在全局作用域下创建一个新的绑定,但该绑定不会添加为全局对象的属性。也就是说,使用let和const不能覆盖全局变量
let RegExp = 'str';
console.log(RegExp) // 'str'
console.log(window.RegExp === RegExp) // false
const name = 'nick';
console.log(name) // 'nick'
console.log("name" in window) // false
建议: 默认使用const,只有确实需要改变变量的值时使用let。因为大部分变量的值在初始化后不应该改变,而预料外的变量值的改变是很多bug的源头
网友评论