在es6中變量的定義方式有:var 、function 早敬、let 忌傻、const 、import搞监、 class水孩。
let
使用let來(lái)定義變量,其在對(duì)應(yīng)的塊級(jí)作用域才能被訪問(wèn)到腺逛。
let定義變量只可以定義一次荷愕,但可以進(jìn)行多次的取值與賦值。
1.基本用法:
輸出的結(jié)果:
從輸出的結(jié)果看棍矛,使用var定義的變量在塊級(jí)作用域外可以被訪問(wèn)到(會(huì)有變量的提升)安疗。使用let定義的變量不能在塊級(jí)作用域外被訪問(wèn)到(不存在變量的提升),則出現(xiàn)報(bào)錯(cuò)够委。但是發(fā)現(xiàn)輸出中居然出現(xiàn) typeof 是什么鬼荐类?它對(duì)b的檢測(cè)返回的是undefined。這是因?yàn)閠ypeof是對(duì)數(shù)據(jù)的類型檢測(cè)茁帽,會(huì)在當(dāng)前作用域?qū)ふ襜玉罐,如果找不到則會(huì)繼續(xù)向上尋找,直到找到window上潘拨,還是沒(méi)有被找到吊输,就會(huì)返回undefined作為這個(gè)變量的值。當(dāng)使用typeof檢測(cè)undefined的類型時(shí)自然就會(huì)返回undefined铁追。
2.避免產(chǎn)生閉包:
閉包:是有權(quán)限訪問(wèn)其他函數(shù)內(nèi)部變量或函數(shù)季蚂,既可以稱為閉包。
接下來(lái)直接附上代碼來(lái)進(jìn)行分析
輸出結(jié)果為:
我們可以發(fā)現(xiàn)在循環(huán)中使用var 定義的 i , 在最后的輸出中答案是 10琅束,而使用let 定義的 i扭屁,輸出正是我們期待的值。因此涩禀,var聲明的i在全局范圍內(nèi)都有效料滥,每次循環(huán)都會(huì)覆蓋舊值,產(chǎn)生閉包艾船。let 聲明的i只在本輪循環(huán)有效葵腹,所以每一次循環(huán)的i都是一個(gè)新的變量高每。
3.暫時(shí)性死區(qū)(臨時(shí)死區(qū))
使用let定義的變量,不能進(jìn)行變量的提升礁蔗。而且定義必須是要放在賦值之前觉义。如果我們把變量的賦值放在定義之前,則會(huì)報(bào)錯(cuò)浴井。這就造成了let定義變量的臨時(shí)死區(qū)的出現(xiàn)。
4.屏蔽window
js中使用var定義的變量相當(dāng)于在window上定義的一個(gè)屬性霉撵,而使用es6的let和const定義的磺浙,則會(huì)屏蔽window,不會(huì)再window上定義一個(gè)與之對(duì)象的屬性徒坡。
通過(guò)上面的代碼撕氧,在瀏覽器控制臺(tái)中可以看出a,b是否變成window上的一個(gè)屬性?
輸出:
可以看出,使用var定義的變量a變成了window的一個(gè)屬性喇完,而使用let定義的變量b伦泥,則在window上不存在,返回undefined崇猫。所以es6中定義的變量能夠有效的屏蔽window午笛,防止過(guò)多的變量定義在全局上酣倾,造成全局空間的污染。
大家下去可以嘗試一下防楷,const會(huì)屏蔽window么?這里直接告訴大家答案:可以则涯。
const
const在日常使用中是用來(lái)定義常量的复局。如何確認(rèn)是常量?通過(guò)一句話來(lái)判斷粟判。
只進(jìn)行一次賦值操作亿昏,N次取值操作的變量,都可以看作是常量
這也是const在let定義變量后的一個(gè)選擇档礁。const可以防止已經(jīng)被賦值的變量被再次賦值角钩。
定義變量在開(kāi)發(fā)中司空見(jiàn)慣的事情,在ES6中合理的使用let與const是能很大的避免在開(kāi)發(fā)中出現(xiàn)不易察覺(jué)的錯(cuò)誤事秀。同時(shí)定義變量也是一個(gè)對(duì)安全機(jī)制的考驗(yàn)彤断。
當(dāng)要定義一個(gè)可以被多次取值和賦值操作的變量時(shí),你會(huì)優(yōu)先考慮用let還是const易迹?我想只要是前端開(kāi)發(fā)者都能說(shuō)出是使用let宰衙。在這里這個(gè)答案是正確的,但是請(qǐng)你在回答這個(gè)答案的時(shí)候考錄一下安全問(wèn)題睹欲,再進(jìn)行回答供炼。
我會(huì)再考慮安全機(jī)制最小原則的前提下優(yōu)先使用const一屋,如果const不能滿足我的條件,再下一步考慮let定義袋哼,甚至使用var都是合理的冀墨。
原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出去:http://www.reibang.com/p/13c5edcba9a9