《02》let 和 const 命令
目錄
1.let命令
基本用法
暫時性死區
不允許重復聲明?
2.塊級作用域
3.const 命令
基本用法
本質
1.let命令
基本用法
ES6 新增了let命令,用來聲明變量。它的用法類似于var,但是所聲明的變量,只在let命令所在的代碼塊內有效。
<!DOCTYPE?html> <html?lang="en"> <head><meta?charset="UTF-8"><meta?http-equiv="X-UA-Compatible"?content="IE=edge"><meta?name="viewport"?content="width=device-width,?initial-scale=1.0"><title>let基礎用法</title> </head> <body><script>{let?a=1;var?b=2;}console.log("變量a:"+a)//未定義console.log("變量b:"+b)//2</script> </body> </html>上面代碼在代碼塊之中,分別用let和var聲明了兩個變量。然后在代碼塊之外調用這兩個變量,結果
let聲明的變量報錯,var聲明的變量返回了正確的值。這表明,let聲明的變量只在它所在的代碼塊有效。
for循環的計數器,就很合適使用let命令。
for(let?i=0;?i<10;?i++){ } console.log("變量i"+i)//Uncaught?ReferenceError:?i?is?not?defined上面代碼中,計數器i只在for循環體內有效,在循環體外引用就會報錯。
下面的代碼如果使用var,最后輸出的是10。
var?a=[]; for(var?i=0;?i<10;?i++){a[i]=function(){console.log(i);} } a[6]();//10上面代碼中,變量i是let聲明的,當前的i只在本輪循環有效,所以每一次循環的i其實都是一個新的變量,所以最后輸出的是6。你可能會問,如果每一輪循環的變量i都是重新聲明的,那它怎么知道上一輪循環的值,從而計算出本輪循環的值?這是因為 JavaScript 引擎內部會記住上一輪循環的值,初始化本輪的變量i時,就在上一輪循環的基礎上進行計算。
暫時性死區
ES6 明確規定,如果區塊中存在let和const命令,這個區塊對這些命令聲明的變量,從一開始就形成了封閉作用域。凡是在聲明之前就使用這些變量,就會報錯。
總之,在代碼塊內,使用let命令聲明變量之前,該變量都是不可用的。這在語法上,稱為“暫時性死區”(temporal dead zone,簡稱 TDZ)。
if (true) {// TDZ開始tmp = 'abc'; // ReferenceErrorconsole.log(tmp); // ReferenceErrorlet tmp; // TDZ結束console.log(tmp); // undefinedtmp = 123;console.log(tmp); // 123 }不允許重復聲明?
let不允許在相同作用域內,重復聲明同一個變量。
// 報錯 function func() {let a = 10;var a = 1; }// 報錯 function func() {let a = 10;let a = 1; }因此,不能在函數內部重新聲明參數。
function func(arg) {let arg; } func() // 報錯function func(arg) {{let arg;} } func() // 不報錯2.塊級作用域
let實際上為 JavaScript 新增了塊級作用域。
function f1() {let n = 5;if (true) {let n = 10;}console.log(n); // 5 }上面的函數有兩個代碼塊,都聲明了變量n,運行后輸出 5。這表示外層代碼塊不受內層代碼塊的影響。如果兩次都使用var定義變量n,最后輸出的值才是 10。
ES6 允許塊級作用域的任意嵌套。
3.const 命令
基本用法
const聲明一個只讀的常量。一旦聲明,常量的值就不能改變。
const PI = 3.1415; PI // 3.1415PI = 3; // TypeError: Assignment to constant variable.上面代碼表明改變常量的值會報錯。
const聲明的變量不得改變值,這意味著,const一旦聲明變量,就必須立即初始化,不能留到以后賦值。
const foo; // SyntaxError: Missing initializer in const declaration上面代碼表示,對于const來說,只聲明不賦值,就會報錯。
const的作用域與let命令相同:只在聲明所在的塊級作用域內有效。
if (true) {const MAX = 5; }MAX // Uncaught ReferenceError: MAX is not definedconst命令聲明的常量也是不提升,同樣存在暫時性死區,只能在聲明的位置后面使用。
本質
const實際上保證的,并不是變量的值不得改動,而是變量指向的那個內存地址所保存的數據不得改動。對于簡單類型的數據(數值、字符串、布爾值),值就保存在變量指向的那個內存地址,因此等同于常量。但對于復合類型的數據(主要是對象和數組),變量指向的內存地址,保存的只是一個指向實際數據的指針,const只能保證這個指針是固定的(即總是指向另一個固定的地址),至于它指向的數據結構是不是可變的,就完全不能控制了。因此,將一個對象聲明為常量必須非常小心。
總結
以上是生活随笔為你收集整理的《02》let 和 const 命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《01》ECMAScript 6 简介
- 下一篇: 读《第一次把事情做对》有感