摘要:我們一起看一下和的引入對(duì)現(xiàn)有的編碼方式會(huì)帶來(lái)哪些影響。和的引入同樣改變了這種現(xiàn)象作用域變量和對(duì)象屬性分得清清楚楚。和引入后,每次循環(huán)都會(huì)創(chuàng)建特定于當(dāng)次循環(huán)作用域的局部變量。
塊級(jí)作用域let&const
js給人的感覺(jué)往往是用起來(lái)比較簡(jiǎn)單,語(yǔ)法上寬松。這給開(kāi)發(fā)者帶來(lái)便利的同時(shí)也造成了一些違反思維習(xí)慣的別扭之處。es6一些新的特性的引入,可以認(rèn)為試圖糾正或補(bǔ)齊js最初設(shè)計(jì)的缺陷。
我們一起看一下let和const的引入對(duì)現(xiàn)有的編碼方式會(huì)帶來(lái)哪些影響。
變量聲明提升眾所周知,變量聲明提升是js中非常最重要的特性之一。也是面試中常被問(wèn)到的點(diǎn)。但對(duì)于js新人來(lái)說(shuō)可能覺(jué)得難以理解,甚至違反直覺(jué)。變量沒(méi)有聲明之前不應(yīng)該能訪問(wèn)啊!
console.log(v1)// undefined var v1 = 1 console.log(v1) // 1
上面這段代碼對(duì)于新手來(lái)說(shuō),undefined的結(jié)果是難以理解的。(心想不應(yīng)該報(bào)錯(cuò)么?)
console.log(v1) // Uncaught ReferenceError: v1 is not defined let v1 = 1 console.log(v1) // 1
使用let之后從邏輯上是符合開(kāi)發(fā)者的思維習(xí)慣的 未聲明之前使用就是會(huì)報(bào)引用錯(cuò)誤,在聲明之后訪問(wèn)變量的值正常返回變量值。
let和const聲明的變量是不會(huì)被提升的,真正實(shí)現(xiàn)了使用前聲明,聲明后再使用。
全局變量不會(huì)變成window的屬性以前在全局作用域下聲明變量時(shí),全局變量自然而然的成為了全局對(duì)象的屬性如:
var a = 1 console.log(window.a === a) // true
對(duì)于這種情況前端開(kāi)發(fā)工程師早已爛熟于心了。let和 const的引入同樣改變了這種現(xiàn)象:
let a = 1 console.log(window.a) // undefined console.log(a) // 1 window.a = 2 console.log(window.a) //2 console.log(a) // 1
作用域變量和對(duì)象屬性分得清清楚楚。
for循環(huán)沒(méi)有陷阱看下這個(gè)前端圈用濫的面試題:
for(var i = 0; i < 5; i++){ setTimeout(function(){ console.log(i) }, 0) } console.log(i)
這題固然難不倒老鳥(niǎo)們。但新手們十有八九會(huì)答錯(cuò)。0 1 2 3 4 5。
是的,從常理來(lái)說(shuō)就應(yīng)該是這樣的,只不過(guò)js中缺少塊級(jí)作用域的概念,var聲明的變量自然而然從for循環(huán)的代碼塊外溢。
let和const引入后,每次循環(huán)都會(huì)創(chuàng)建特定于當(dāng)次循環(huán)作用域的局部變量。換句話(huà)說(shuō)每次循環(huán)都有與之綁定的i值。執(zhí)行完成之后即銷(xiāo)毀。不會(huì)外溢到外層作用域。下面的代碼是符合預(yù)期的:
for(let i = 0; i<5; i++){ setTimeout(function(){ console.log(i) //0 1 2 3 4 }, 0) } console.log(i) // ReferenceError: i is not defined最佳實(shí)踐
為了避免代碼中出現(xiàn)意外驚喜,日常coding中首先是使用const,可以有效避免變量被意外修改。如果變量有被修改的需求首選使用 let。var的使用盡量減少使用。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/90209.html
摘要:關(guān)于本書(shū),我會(huì)寫(xiě)好幾篇讀書(shū)筆記用以記錄那些讓我恍然大悟的瞬間,本文是第一篇弄懂的作用域和閉包。作用域也可以看做是一套依據(jù)名稱(chēng)查找變量的規(guī)則。聲明實(shí)際上是根據(jù)你傳遞給它的對(duì)象憑空創(chuàng)建了一個(gè)全新的詞法作用域。 《你不知道的JavaScript》真的是一本好書(shū),閱讀這本書(shū),我有多次哦,原來(lái)是這樣的感覺(jué),以前自以為理解了(其實(shí)并非真的理解)的概念,這一次真的理解得更加透徹了。關(guān)于本書(shū),我會(huì)寫(xiě)好...
摘要:下面,我就從基本對(duì)象說(shuō)起,聊一聊不可變數(shù)據(jù)和的一切??勺兒凸蚕硎侨f(wàn)惡之源不可變數(shù)據(jù)其實(shí)是函數(shù)式編程相關(guān)的重要概念。相對(duì)的,函數(shù)式編程中認(rèn)為可變性是萬(wàn)惡之源。針對(duì)于此,我推薦一款已經(jīng)大名鼎鼎的類(lèi)庫(kù)來(lái)處理不可變數(shù)據(jù)。 作為前端開(kāi)發(fā)者,你會(huì)感受到JS中對(duì)象(Object)這個(gè)概念的強(qiáng)大。我們說(shuō)JS中一切皆對(duì)象。最核心的特性,例如從String,到數(shù)組,再到瀏覽器的APIs,對(duì)象這個(gè)概念無(wú)處不...
摘要:這也是前端面試經(jīng)常詢(xún)問(wèn)的問(wèn)題,經(jīng)常問(wèn)你出現(xiàn)了哪些新的特性,平時(shí)又使用過(guò)那些。 這也是前端面試經(jīng)常詢(xún)問(wèn)的問(wèn)題,經(jīng)常問(wèn)你es6出現(xiàn)了哪些新的特性,平時(shí)又使用過(guò)那些。在編寫(xiě)此教程的時(shí)候,第一句話(huà)往往就是面試常常問(wèn)到的地方,然后后面就是他的詳細(xì)解釋?zhuān)嬖囈蟮膬?nèi)容我會(huì)用*標(biāo)記出來(lái)。寫(xiě)技術(shù)文檔是真的累啊,雖然是看別人的文檔,但是你得看很多,而且還得自己總結(jié)啊。所以說(shuō)要是覺(jué)得對(duì)你有用還是幫我點(diǎn)個(gè)s...
摘要:這也是前端面試經(jīng)常詢(xún)問(wèn)的問(wèn)題,經(jīng)常問(wèn)你出現(xiàn)了哪些新的特性,平時(shí)又使用過(guò)那些。 這也是前端面試經(jīng)常詢(xún)問(wèn)的問(wèn)題,經(jīng)常問(wèn)你es6出現(xiàn)了哪些新的特性,平時(shí)又使用過(guò)那些。在編寫(xiě)此教程的時(shí)候,第一句話(huà)往往就是面試常常問(wèn)到的地方,然后后面就是他的詳細(xì)解釋?zhuān)嬖囈蟮膬?nèi)容我會(huì)用*標(biāo)記出來(lái)。寫(xiě)技術(shù)文檔是真的累啊,雖然是看別人的文檔,但是你得看很多,而且還得自己總結(jié)啊。所以說(shuō)要是覺(jué)得對(duì)你有用還是幫我點(diǎn)個(gè)s...
閱讀 2151·2021-11-11 16:54
閱讀 1117·2021-10-12 10:12
閱讀 444·2019-08-30 15:43
閱讀 721·2019-08-29 13:15
閱讀 1145·2019-08-29 13:12
閱讀 1597·2019-08-26 12:09
閱讀 1726·2019-08-26 10:24
閱讀 2347·2019-08-26 10:15