ES6中新增了let和const命令,分別用于聲明變量和常量。
成都創(chuàng)新互聯(lián)于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元義烏做網(wǎng)站,已為上家服務(wù),為義烏各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108
在ES6之前的版本中,使用var
聲明變量,在ES6中新增了let
來(lái)聲明變量。let
完全可以取代var
,因?yàn)槎叩恼Z(yǔ)義相同,而且let
沒(méi)有“副作用”。
我們先來(lái)看一下let
命令有哪些特點(diǎn):
JavaScript是弱類型的編程語(yǔ)言,在ES6之前使用var
關(guān)鍵字聲明變量,會(huì)發(fā)生變量提升的現(xiàn)象。簡(jiǎn)單來(lái)說(shuō),就是在聲明變量之前就對(duì)該變量進(jìn)行調(diào)用,程序不會(huì)報(bào)錯(cuò),而且打印出來(lái)的值為undefined
。如果是有Java或C++編程經(jīng)驗(yàn)的小伙伴,肯定對(duì)這種現(xiàn)象是無(wú)法忍受的。我們用一段代碼來(lái)演示一下這種現(xiàn)象:
function test(){
console.log(i);
var i = 1;
}
test();
運(yùn)行結(jié)果:
undefined
上面代碼中,變量i
是使用var
命令聲明的,我們?cè)谧兞柯暶髦霸诳刂婆_(tái)打印i
,雖然此時(shí)變量i
還沒(méi)有聲明,但是該變量已經(jīng)存在了,只不過(guò)是沒(méi)有值,所以會(huì)輸出undefined
。
如果是同樣的代碼,把var
替換成let
來(lái)聲明,其他代碼不變,程序運(yùn)行后的結(jié)果為:
當(dāng)變量使用let
聲明時(shí),不會(huì)發(fā)生變量提升,這就說(shuō)明在變量聲明之前,變量i
是不存在的,要打印一個(gè)不存在的變量,就會(huì)拋出上面的錯(cuò)誤。
在ES5 中有兩個(gè)作用域,分別是全局作用域和函數(shù)作用域,到了ES6就新增了一個(gè)塊級(jí)作用域。如果沒(méi)有塊級(jí)作用域的話,在處理業(yè)務(wù)場(chǎng)景時(shí)會(huì)帶來(lái)很多不便,比如內(nèi)層變量覆蓋外層變量,再或者是使用for
循環(huán)時(shí),循環(huán)中迭代的變量泄露為全局變量等等。
ES6中的let
命令為JavaScript新增了塊級(jí)作用域,我們看下面的代碼:
function test() {
let i = 1;
if(true){
let i = 2;
}
console.log(i);
}
test();
運(yùn)行結(jié)果為:
1
在test()
函數(shù)代碼塊中,對(duì)變量i
做了兩次聲明,按照var
命令聲明變量的邏輯,結(jié)果應(yīng)該是2
,但是使用let
命令聲明的變量,在該變量的代碼塊中,不受內(nèi)層代碼塊的影響。無(wú)論有多少層級(jí)的代碼塊,其每一層都有一個(gè)單獨(dú)的作用域。在內(nèi)層作用域中可以定義外層作用域的同名變量,但變量的值不受外層作用域變量的影響。
如果理解了let
命令的塊級(jí)作用域的話,那么再來(lái)理解暫時(shí)性死區(qū),就輕松多了。我們對(duì)上面那段代碼稍加改造,演示暫時(shí)性死區(qū):
function test() {
let i = 1;
if(true){
console.log(i);
let i = 2;
}
console.log(i);
}
test();
運(yùn)行結(jié)果為:
由于各層級(jí)代碼塊都有自己?jiǎn)为?dú)的作用域,內(nèi)層作用域不受外層的影響,所以當(dāng)我們?cè)?code>if()語(yǔ)句中再次聲明變量i
時(shí),該作用域下的變量是獨(dú)立存在的,在未聲明之前就調(diào)用該變量,就會(huì)出現(xiàn)我們前面說(shuō)過(guò)的“變量提升”的概念,let
命令是不存在變量提升的,所以就會(huì)拋出上面這種錯(cuò)誤。
const
命令的用法和let
類似,使用const
命令聲明的是一個(gè)只讀常量,一旦聲明,常量的值就不能改變。const
聲明的變量值不能改變,這就意味著,變量一旦聲明后,就必須馬上給其賦初始化值。
但是在let
和const
之間,我建議優(yōu)先使用const
,const
相比let
而言,有幾個(gè)優(yōu)點(diǎn):
一是const
從語(yǔ)義上就表示常量,那就可以提醒協(xié)同開(kāi)發(fā)的其他人員,這個(gè)變量的值不能被修改,防止誤操作修改變量的值導(dǎo)致程序出錯(cuò);
二是const
比較符合函數(shù)式的編程思想,運(yùn)算不改變值,只是新建值;
三是JavaScript編譯器會(huì)對(duì)const
進(jìn)行優(yōu)化,如果const
使用頻率比較高的話,有利于提高程序的運(yùn)行效率,這取決于let
和const
在底層編譯器內(nèi)部的處理差異。
如果從長(zhǎng)遠(yuǎn)的角度看,JavaScript有可能會(huì)實(shí)現(xiàn)多線程編程,考慮到線程安全,let
命令聲明的變量只能在單線程中使用,不能用于多線程的數(shù)據(jù)共享。
當(dāng)前題目:ES6教程:let和const命令的用法-創(chuàng)新互聯(lián)
文章鏈接:http://muchs.cn/article28/cdscjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、網(wǎng)站改版、全網(wǎng)營(yíng)銷推廣、商城網(wǎng)站、云服務(wù)器、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容