let声明和块级作用域

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(){}
//报错
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值