let
let 可以看做像var一样的功能做申明的作用
为什么要使用let
var a=1
if(true){
var a=2
}
console.log(a)
// 2
var a='博主大长腿'
for(var i=0;i<a.length;i++){
****
}
console.log(i)
// 5
由上面两个例子可以看出,在块级作用域内申明的变量全部都进入父级或者全局的作用域内了,这样的话会产生大量的无用的变量,同时位后面挖坑,let就很好的解决了这一问题,其实我们可以把块级作用域下的let装化成es5的事项方式。如下:
//es6
{let a=1}
//es5
(function(){
var a=1
}
)()
这样的话则转化成了在函数作用域内生成一个变量,该变量不会邪路出去。
特点
1.无法变量提升
console.log(a)
var a=1
// undefined
console.log(a)
let a=1
// 报错
2.存在let不能重复定义
var a=1
var a=2
// 正常
let a=1
let a=2
// 报错
var a=1
let a=2
// 报错
let a=1
let a=2
//报错
只要同一作用域内存在相同变量被声明都会报错
3.只在块级作用域内生效
var a=1
if(true){
let a=2
}
console.log(a)
// 1
4.块级作用域内只能够拿到该作用域内声明的let变量,外部被忽略
var a='博主好帅'
if(true){
a='博主不帅'
let a
}
// 报错
博主不帅这个赋值语句报错(说明博主还是很帅的嘛),块级作用域内存在let定义,就算外部定义了也会报错。
注意:只有存在let声明的时候才会存在块级作用域
块级作用域与函数声明
举个栗子
var function cc(){console.log('你好') }
(function(){
if(false){
function cc(){console.log('你不好')}
}
cc()
})()
上面的例子。早es5流浪器生成的结果为 ‘你不好’, 而在es6的流浪器中我们发现报错,cc不是一个函数,这就横有意思了
- 由于在es5中,声明函数会被提升到判断语句的外边,所以会得出结果
- 而在es6中,声明函数则跟var 一样,直接一个声明提升,var cc=undefined 提升到函数的最顶端,所得到该结果
应为这种问题的产生,所以我们在必须要在块级作用域内声明函数时,可以采用函数表达式来替代函数声明
在ES6中,声明函数必须在大括号的包裹下才能够生成,要不让会报错
'use strict'
if(true){
function cc(){}
}
// 正常
'use strict'
if(true)
function cc(){}
//报错