您的位置:首页 > 其它

let声明和块级作用域

2017-06-27 14:45 169 查看

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(){}
//报错
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: