java区块作用域_es6之块级作用域

块级作用域

在es6(es2015)之前, 也就是es5中,作用域只有两种:

1. 全局作用域

2. 函数作用域

正因为只有这两种作用域, 所以存在 "变量提升" 现象, 即变量可以在声明之前使用,值为undefind.如下

console.log(tem);//输出undefined

var tem = 6;

上面代码中,变量 tem 会发生变量提升,即脚本开始运行时,变量foo已经存在了,但是没有值,所以会输出undefined。

在es6中新增了块级作用域,新增的块级作用域通过 let 和 const 属性来体现:

console.log(tem);//输出undefined

let tem = 6;

下面介绍一下 let 和 const

let 用法和 var 类似, 但是let声明的变量只在块级作用域内有效

function fun1() {

let n= 5;if (true) {

let n= 10;

}

console.log(n);//5

}

const 声明的是一个只读的常量.一旦声明, 常量的值就不能再改变,const一旦声明变量,就必须立即初始化,不能留到以后赋值。

const PI = 3.14;

PI//3.14

PI= 3;//TypeError: Assignment to constant variable.

let和const有以下共同点

1.只在声明的块级作用域内有效

2.不存在变量提升

3.存在暂时性死区

if (true) {

n= 'abc'; //ReferenceError

let n;

}

ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

在代码块内,使用let 或 const命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

4.不可重复声明, let 和 const都不允许在同一作用域内重复声明同一个变量

if(true) {

let a= 10;var a = 1;

}//Identifier 'a' has already been declared

if(true) {

let a= 10;

let a= 1;

}//Identifier 'a' has already been declared

if(true) {const a = 10;

let a= 1;

}//Identifier 'a' has already been declared

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值