您好,登錄后才能下訂單哦!
在ES6之前的版本中,使用var
聲明變量,在ES6中新增了let
來聲明變量。let
完全可以取代var
,因為二者的語義相同,而且let
沒有“副作用”。
我們先來看一下let
命令有哪些特點:
JavaScript是弱類型的編程語言,在ES6之前使用var
關鍵字聲明變量,會發生變量提升的現象。簡單來說,就是在聲明變量之前就對該變量進行調用,程序不會報錯,而且打印出來的值為undefined
。如果是有Java或C++編程經驗的小伙伴,肯定對這種現象是無法忍受的。我們用一段代碼來演示一下這種現象:
function test(){
console.log(i);
var i = 1;
}
test();
運行結果:
undefined
上面代碼中,變量i
是使用var
命令聲明的,我們在變量聲明之前在控制臺打印i
,雖然此時變量i
還沒有聲明,但是該變量已經存在了,只不過是沒有值,所以會輸出undefined
。
如果是同樣的代碼,把var
替換成let
來聲明,其他代碼不變,程序運行后的結果為:
當變量使用let
聲明時,不會發生變量提升,這就說明在變量聲明之前,變量i
是不存在的,要打印一個不存在的變量,就會拋出上面的錯誤。
在ES5 中有兩個作用域,分別是全局作用域和函數作用域,到了ES6就新增了一個塊級作用域。如果沒有塊級作用域的話,在處理業務場景時會帶來很多不便,比如內層變量覆蓋外層變量,再或者是使用for
循環時,循環中迭代的變量泄露為全局變量等等。
ES6中的let
命令為JavaScript新增了塊級作用域,我們看下面的代碼:
function test() {
let i = 1;
if(true){
let i = 2;
}
console.log(i);
}
test();
運行結果為:
1
在test()
函數代碼塊中,對變量i
做了兩次聲明,按照var
命令聲明變量的邏輯,結果應該是2
,但是使用let
命令聲明的變量,在該變量的代碼塊中,不受內層代碼塊的影響。無論有多少層級的代碼塊,其每一層都有一個單獨的作用域。在內層作用域中可以定義外層作用域的同名變量,但變量的值不受外層作用域變量的影響。
如果理解了let
命令的塊級作用域的話,那么再來理解暫時性死區,就輕松多了。我們對上面那段代碼稍加改造,演示暫時性死區:
function test() {
let i = 1;
if(true){
console.log(i);
let i = 2;
}
console.log(i);
}
test();
運行結果為:
由于各層級代碼塊都有自己單獨的作用域,內層作用域不受外層的影響,所以當我們在if()
語句中再次聲明變量i
時,該作用域下的變量是獨立存在的,在未聲明之前就調用該變量,就會出現我們前面說過的“變量提升”的概念,let
命令是不存在變量提升的,所以就會拋出上面這種錯誤。
const
命令的用法和let
類似,使用const
命令聲明的是一個只讀常量,一旦聲明,常量的值就不能改變。const
聲明的變量值不能改變,這就意味著,變量一旦聲明后,就必須馬上給其賦初始化值。
但是在let
和const
之間,我建議優先使用const
,const
相比let
而言,有幾個優點:
一是const
從語義上就表示常量,那就可以提醒協同開發的其他人員,這個變量的值不能被修改,防止誤操作修改變量的值導致程序出錯;
二是const
比較符合函數式的編程思想,運算不改變值,只是新建值;
三是JavaScript編譯器會對const
進行優化,如果const
使用頻率比較高的話,有利于提高程序的運行效率,這取決于let
和const
在底層編譯器內部的處理差異。
如果從長遠的角度看,JavaScript有可能會實現多線程編程,考慮到線程安全,let
命令聲明的變量只能在單線程中使用,不能用于多線程的數據共享。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。