這個問題可能顯的有些小白了,只是我在看文檔的時候,遇到了問題,又不知道怎么解決。
一般的文檔和一些博客都說,應當避免變量污染,即,不適用var定義變量,這會導致變量成為window的屬性。
然而,我今天自己寫代碼的時候發(fā)現(xiàn),我用var aaa = 321;然后 console.log(window.aaa) => 打印321.
這就讓我很奇怪了,這和博客文檔說的怎么自相矛盾呢?
es6里面的let和const不會出現(xiàn)這種情況,抱著研究的態(tài)度,希望有能人給指出。不勝感激。
在全局環(huán)境下var,function聲明的變量會自動成為全局對象的屬性,let、const聲明的變量存在詞法環(huán)境中,不會掛載到全局對象上。主要原因我大致講一下:
ECMAScript規(guī)范中定義了兩種類型:一種是語言類型,比如Object、String、Number等。還有一種是規(guī)范類型,你不能用javascript語言具體的訪問到,只存在語言內(nèi)部。規(guī)范類型中有一種叫詞法環(huán)境也就是常說的詞法作用域。每一個詞法環(huán)境都有自己的環(huán)境記錄。全局環(huán)境有對應的全局環(huán)境記錄,全局環(huán)境記錄是對象環(huán)境記錄和聲明性環(huán)境記錄的一個組合。每個對象環(huán)境記錄綁定了一個對象,全局環(huán)境下綁定的就是全局對象,瀏覽器下是window,node下是global。全局環(huán)境下的對象環(huán)境記錄中指出了綁定的對象中包含內(nèi)建的綁定,像Object、Array、evel、Date等屬性,還有FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration,和VariableDeclaration的綁定,也就是var、function聲明的變量,所以在全局環(huán)境下var,function聲明的變量會成為全局對象的屬性,上面說的4種聲明外,所有其他的聲明都屬于聲明性環(huán)境記錄,也就是說let、const聲明的變量屬于聲明性環(huán)境記錄,此外還包括class聲明的變量等。所以let和const聲明的變量你是不能用window.xxx訪問的。
具體你可以看https://segmentfault.com/a/11... 這篇文章
打印的結果就是博客文檔所說的內(nèi)容,使用var
定義,變量會提升至作用域頂部即全局作用域,這樣導致變量成為window
的屬性,那么訪問window.aaa
當然可以得到321
。
使用ES6中的let和const則不會出現(xiàn)這種情況,因為它們可以把變量的作用域限制在當前代碼塊中即局部作用域,并且聲明的變量不會被提升,所以不會出現(xiàn)window.aaa
的打印結果為321。
另外就變量提升而言,下面有一個很明顯的栗子:
// 使用var聲明
console.log(aaa)
var aaa = 321 // undefined
// 使用let聲明
console.log(aaa) // Uncaught ReferenceError(報錯)
let aaa = 321
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學院和江蘇省首批服務外包人才培訓基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術與教育服務機構,發(fā)展為教育服務業(yè)的綜合性企業(yè)集團,成為集合面授教學培訓、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。