let 和const
let 命令
es6新增了let命令,用于声明变量,与var用法类似,但是使用let声明变量只在它所在的块内有效,而var则是定义的全局变量
{ let a=10; var b=1; } a //a is not defined,外部的a不能访问到上面块中定义的a变量 b //1
let不存在变量提升提升
//使用var会发生变量提升,当脚本开始运行使用var命令声明的变量已经存在 console.log(foo); //undefined var foo=2; console.log(foo); //报错ReferenceError let foo=2; //使用let声明,声明的变量一定要在声明之后使用,否则会报错
let不允许重复声明
let不允许在相同作用域内重复声明同一个变量
//报错 function(){ let a=10; var a=1; //let a=3; }
const命令
const用于声明常量,并且该常量那个是只读常量,一旦声明该常量就不能被更改
const a=1; a //1 a=2; //报错
并且const只声明,不赋值也会报错。
const a; //报错
const变量和let一样只能在声明之后使用,并且命令生命的变量也不会提升,同样也不可以重复声明。
const本质
const的常量不能够更改实质上并不是变量的额值不能更改,而是变量指向的内存地址不能变动。
块级作用域
es5只有全局作用域和函数作用域,但是没有块级作用域。
没有块级作用域导致的问题
- 内层变量可能会覆盖外层变量
- 用来计数的循环变量泄露为全局变量
for(var i=0;i<10;i++){ console.log(i) } console.log("外部"+i) 初出结果: 1 2 3 4 5 6 7 8 9 外部10
可以看出外部的i会受到循环体中i的影响,如果使用let就会有块级作用域,最后就会显示,外部i不能找到就会报错。
es6的块级作用域
在块级作用域中,外层作用域不能访问内层作用域的变量,,但是内层作用域可以定义外层作用域的同名变量。
function example(){ let n=5; if(true){ let n=10; //内层作用域可以和外层作用域声明同名变量 } console.log(n); //5,外层作用域不会受到内层作用域的影响 }
块级作用域与函数声明
在es5中规定,函数只能在顶层作用域和函数作用域之中声明,不能再块级作用域中声明。
但是es6有所改变:
- 允许在块级作用域内声明函数
- 函数声明允许类似var,会提升到全局作用域或函数作用头部。
- 函数声明会提升到块级作用域头部
- 但是es6规定,在块级作用域中声明函数类似于let,在块级作用域之外不能引用。
- 但是需要避免在块级作用域中声明函数,一定要使用函数表达式形式写,而不是韩红素声明语句
//函数声明语句 { let a="test" function(){ return a; } } //函数表达式 { let a="test"; let f=function(){ return a; }; } //并且块级作用域一定要有大括号,才能声明函数