鍍金池/ 問答/HTML/ js使用var定義的變量為什么能在window.xxx訪問?

js使用var定義的變量為什么能在window.xxx訪問?

這個問題可能顯的有些小白了,只是我在看文檔的時候,遇到了問題,又不知道怎么解決。

一般的文檔和一些博客都說,應當避免變量污染,即,不適用var定義變量,這會導致變量成為window的屬性。

然而,我今天自己寫代碼的時候發(fā)現(xiàn),我用var aaa = 321;然后 console.log(window.aaa) => 打印321.
這就讓我很奇怪了,這和博客文檔說的怎么自相矛盾呢?
es6里面的let和const不會出現(xiàn)這種情況,抱著研究的態(tài)度,希望有能人給指出。不勝感激。

回答
編輯回答
法克魷

var aaa = 321 === this.aaa=321

你定義的是全局變量 this===window

window.aaa===this.aaa

2017年11月20日 23:47
編輯回答
掛念你

似乎是你理解錯了,正是因為你的var,導致可以用window訪問var 定義的變量。
1.var 定義的是全部變量,
2.window在BOM 里有兩個作用,一是作為瀏覽器的一個接口,二是作為Global(全局對象)
因此,在全局作用域下聲明的變量方法,都會成為window 的屬相和方法

你在思考下,沒有矛盾的

2017年1月31日 06:01
編輯回答
浪蕩不羈

在全局環(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... 這篇文章

2018年6月8日 22:21
編輯回答
笨尐豬

打印的結果就是博客文檔所說的內(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
2018年1月21日 06:46
編輯回答
傻叼

文檔說的沒毛病,console.log(window.aaa) 結果是321,不就是說明aaa作為window的屬性了

2017年5月13日 08:36