摘要:會出現(xiàn)這樣的情況是因為擁有暫時性死區(qū)。規(guī)定暫時性死區(qū)和語句不出現(xiàn)變量提升,主要是為了減少運行時錯誤,防止在變量聲明前就使用這個變量,從而導致意料之外的行為。
首先我們應該知道js引擎在讀取js代碼時會進行兩個步驟:
第一個步驟是解釋。
第二個步驟是執(zhí)行。
所謂解釋就是會先通篇掃描所有的Js代碼,然后把所有聲明提升到頂端,第二步是執(zhí)行,執(zhí)行就是操作一類的。
我們先來看個簡單的變量提升案例吧a = "javascript"; var a; console.log(a);//"javascript"
console.log(b);//undefined var b="javascript"
遇到 script 標簽的話 js 就進行預解析,將變量 var 和 function 聲明提升,但不會執(zhí)行 function,然后就進入上下文執(zhí)行,上下文執(zhí)行還是執(zhí)行預解析同樣操作,直到?jīng)]有 var 和 function,就開始執(zhí)行上下文。如:
a=5; show(); var a; function show(){};
預解析:
function show(){}; var a; a=5; show();
需要注意都是函數(shù)聲明提升直接把整個函數(shù)提到執(zhí)行環(huán)境的最頂端。
那么let/const和var又有什么區(qū)別呢??let/const是使用區(qū)塊作用域;var是使用函數(shù)作用域。
在let/const聲明之前就訪問對應的變量與常量,會拋出ReferenceError錯誤;但在var聲明之前就訪問對應的變量,則會得到undefined。
console.log(aVar) // undefined console.log(aLet) // causes ReferenceError: aLet is not defined var aVar = 1 let aLet = 2
會出現(xiàn)這樣的情況是因為let/const擁有“暫時性死區(qū)(TDZ)”。
什么是暫時性死區(qū)?當程序的控制流程在新的作用域(module, function或block作用域)進行實例化時,在此作用域中的用let/const聲明的變量會先在作用域中被創(chuàng)建出來,但因此時還未進行詞法綁定,也就是對聲明語句進行求值運算,所以是不能被訪問的,訪問就會拋出錯誤。所以在這運行流程一進入作用域創(chuàng)建變量,到變量開始可被訪問之間的一段時間,就稱之為TDZ(暫時死區(qū))。
結(jié)論:let/const聲明的變量,的確也是有提升(hoist)的作用。這個是很容易被誤解的地方,實際上以let/const聲明的變量也是會有提升(hoist)的作用。提升是JS語言中對于變量聲明的基本特性,只是因為TDZ的作用,并不會像使用var來聲明變量,只是會得到undefined而已,現(xiàn)在則是會直接拋出ReferenceError錯誤,而且很明顯的這是一個在運行期間才會出現(xiàn)的錯誤。
ES6 規(guī)定暫時性死區(qū)和let、const語句不出現(xiàn)變量提升,主要是為了減少運行時錯誤,防止在變量聲明前就使用這個變量,從而導致意料之外的行為。這樣的錯誤在 ES5 是很常見的,現(xiàn)在有了這種規(guī)定,避免此類錯誤就很容易啦~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/99943.html
showImg(https://segmentfault.com/img/remote/1460000017757580); let和const是 ES6 新增的命令,用于聲明變量,這兩個命令跟 ES5 的var有許多不同,并且let和const也有一些細微的不同,再認真閱讀了阮一峰老師的文檔后,發(fā)現(xiàn)還是有一些不知道的細節(jié)... 博客、前端積累文檔、公眾號、GitHub 內(nèi)容: var和let...
摘要:眾所周知,中的聲明存在變量提升機制,因此引用了塊級作用域來強化對變量生命周期的控制聲明不會被提升,有幾個需要注意的點不能被重復聲明假設(shè)作用域中已經(jīng)存在某個標識符無論該標識符是通過聲明還是變量聲明,此時再使用或關(guān)鍵定聲明會拋錯此處則會拋出錯誤 眾所周知,js中的var聲明存在變量提升機制,因此ESMAScript 6引用了塊級作用域來強化對變量生命周期的控制let const 聲明不會被...
摘要:基本數(shù)據(jù)類型在中,基本數(shù)據(jù)類型有種,即數(shù)值字符串布爾值。兩個布爾值轉(zhuǎn)為數(shù)值進行比較。對于對象和布爾值,調(diào)用它們的方法得到對應的字符串值,然后進行字符串相加。減法對于字符串布爾值或者,自動調(diào)用,轉(zhuǎn)換結(jié)果若為,那么最終結(jié)果為。 這篇文章,來聊聊 JS 中的數(shù)據(jù)類型與變量。這是在學習 JS 時最基礎(chǔ)的一類問題,但卻很重要。希望我的分享有幫助到你。 文章開頭,我先提幾個面試中遇到的問題: 比如...
摘要:前言和的區(qū)別是老生常談,看到網(wǎng)上一些文章的總結(jié),有的不太全面,甚至有的描述不太準確,在這里盡量全面的總結(jié)下這三者的區(qū)別。最后以上大概是總結(jié)后的內(nèi)容,看來,還是多用吧。 前言 var 和 let 的區(qū)別是老生常談,看到網(wǎng)上一些文章的總結(jié),有的不太全面,甚至有的描述不太準確,在這里盡量全面的總結(jié)下這三者的區(qū)別。 let 是 ES6新增的變量類型,用來代替 var 的一些缺陷,跟 var...
閱讀 2458·2021-09-28 09:36
閱讀 3597·2021-09-22 15:41
閱讀 4388·2021-09-04 16:45
閱讀 1957·2019-08-30 15:55
閱讀 2847·2019-08-30 13:49
閱讀 825·2019-08-29 16:34
閱讀 2370·2019-08-29 12:57
閱讀 1679·2019-08-26 18:42