es6之块级作用域
塊級作用域
在es6(es2015)之前, 也就是es5中,作用域只有兩種:
1. 全局作用域
2. 函數(shù)作用域
正因為只有這兩種作用域, 所以存在 "變量提升" 現(xiàn)象, 即變量可以在聲明之前使用,值為undefind.如下
上面代碼中,變量 tem 會發(fā)生變量提升,即腳本開始運行時,變量foo已經(jīng)存在了,但是沒有值,所以會輸出undefined。
在es6中新增了塊級作用域,新增的塊級作用域通過 let 和 const 屬性來體現(xiàn):
console.log(tem);//輸出undefined let tem = 6;下面介紹一下 let 和 const
let 用法和 var 類似, 但是let聲明的變量只在塊級作用域內(nèi)有效
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.只在聲明的塊級作用域內(nèi)有效
2.不存在變量提升
3.存在暫時性死區(qū)
ES6明確規(guī)定,如果區(qū)塊中存在let和const命令,這個區(qū)塊對這些命令聲明的變量,從一開始就形成了封閉作用域。凡是在聲明之前就使用這些變量,就會報錯。
在代碼塊內(nèi),使用let 或 const命令聲明變量之前,該變量都是不可用的。這在語法上,稱為“暫時性死區(qū)”(temporal dead zone,簡稱 TDZ)。
4.不可重復(fù)聲明, let 和 const都不允許在同一作用域內(nèi)重復(fù)聲明同一個變量
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?
轉(zhuǎn)載于:https://www.cnblogs.com/yuqing6/p/6777746.html
總結(jié)
- 上一篇: Java 反射机制[Field反射]
- 下一篇: 如何使用 iCloud 钥匙串管理和存储