1.es6 新增的let const 命令
let用来定义一个局部变量,故名思意就是只在当前代码块可用
1.1 let 声明的变量不存在变量提升(var 声明的变量存在变量提升)且代码块内 暂时性死区 且不允许重复声明
列子
var b = 3; function fn () { console.log (b) var b = 4 } fn(); // undefined //由于存在变量提升 实际代码是 /* var b = 3; function fn () { var b = undefined console.log (b) b = 4 } */ //使用let 定义 function fn1() { console.log (b) let b = 4 } fn1(); //报错 提示b没有定义 使用let 定义的b 不存在变量提升 并且也访问不到外面定义的b ,暂时性死区
function fn2() {
let aa = 3
let aa = 4
}
fn2() //报错,dentifier 'aa' has already been declared 不能重复定义
1.2 const 常量
定义:声明后的常量就不能修改,不能重复定义 ,也只在当前代码块内有用,常量定义时必须先赋值
const ba //报错必须先赋值 { const bb = 4 } console.log(bb) //bb未定义, 只在当前代码块可用 const bc = 56 bc = 54 //报错,常量定义后不能修改值 const person = { name: 'czklove', age: '18' } person.age = 24 // 不报错,对于引用类型,常量只是不改变他的地址 //可以使用 Object.freeze 冻结 const child = Object.freeze({ name: 'czklove', age: '18' }) child.name = 'lll' //正常模式下该行代码忽略 严格模式下报错 //如果对象的属性也是引用类型 ,则需要冻结对象上所有的属性,调用递归的方法
1.3 var
es6 之前除了在方法里定义的var 变量之外,所有var 定义的var 变量都是全局可用
var c = 44 function fn3() { c = 56 b = 45 } console.log(b) //报错 b没有定义 for(var i = 1;i < 9; i++) { } console.log(i) //9 for ()里定义的变量 全局可用 //变量声明提升 可以见let 的例子