變數宣告帶var與不帶var的區別
JavaScript宣告變數帶var與不帶var區別的問題在網路上基本已經談爛了。
無論是在網上搜尋或者在技術群裡請教,基本都能得到滿滿的回覆。
回覆內容絕大多數如“不帶var宣告的變數的作用域是全域性的,帶var宣告的變數的作用域是當前所在作用域”。
通過程式碼例項驗證一下熱心夥伴們的回覆是否正確:
[JavaScript] 純文字檢視 複製程式碼function func(){ address="青島市南區"; var webName="螞蟻部落"; } func(); console.log(address); console.log(webName);
程式碼執行效果截圖如下:
根據上面理論,address宣告沒有使用var,那麼此變數的作用域是全域性的,而webName宣告使用var,作用範圍是函式作用域,所以在函式外部可以正常列印出address值,列印webName則會報錯,看起來一切都很正確。
現在可以很負責任的告訴大家,上面的結論是錯誤的,只有使用var宣告的才是變數。
看一段程式碼例項:
[JavaScript] 純文字檢視 複製程式碼console.log(webName); console.log(address); var webName; address;
程式碼執行效果截圖如下:
大家知道,變數宣告有前置現象,如果address也是變數,那麼它一定也會前置。
列印結果會與webName相同,然而事實是報錯了,分析如下:
(1).首先明確一點,在ES規範明確規定只有用var、let或者const宣告的才是變數或者常量。
(2).不使用var建立的address是全域性物件的一個屬性,屬性並沒有前置現象,所以會報錯。
既然webName是變數,那為什麼可以使用window.webName訪問此變數,好像webName也是一個屬性。其實並不是,變數在執行上下文中的變數物件(VO)中儲存,是變數物件的一個屬性,在全域性執行上下文中,全域性物件恰好是變數物件,於是全域性作用域中的變數可以使用全域性物件window訪問。這也是為什麼delete無法刪除使用var宣告的變數,可以刪除不適用var宣告的"變數"的原因(eval執行上下文除外)。
特別說明:除了上下文,其他上下文中無法直接訪問變數物件,因為這是內部的一種實現機制。
很多時候,有些知識點看起來非常簡單,其實在它的後面隱藏比較深層次的一些原理,知曉這些原理之後,很多令人迷惑的奇怪現象會迎刃而解,當然自身也能有一種豁然開朗的快感和極大的成就感。
相關閱讀:
(1).let可以參閱JavaScript let 命令一章節。
(2).變數物件可以參閱JavaScript 變數物件一章節。
(3).delete可以參閱JavaScript delete用法一章節。
相關文章
- JavaScript變數宣告帶var與不帶var區別JavaScript變數
- js宣告變數帶var和不帶var的區別JS變數
- var與let宣告變數的區別變數
- 使用var和不使用var宣告變數的區別變數
- var、let、const宣告變數的區別變數
- var、let、const變數宣告的區別及特點變數
- var與ES6中const、let宣告的變數的區別變數
- 變數和函式宣告提升,let和var const區別變數函式
- Shell--引用變數帶不帶""的區別變數
- JavaScript全域性作用域下,變數加var和不加var的區別。JavaScript變數
- let與var的區別
- 只有使用var宣告的才是真正的變數變數
- TypeScript let與var的區別TypeScript
- js中 let 與 var 的區別JS
- 1分鐘帶你瞭解var let 和 const 的區別
- var和public的區別
- var 和 let 的區別
- ${VAR:=預設值}和${VAR:-預設值} 區別
- var、const、let 的區別
- java 10的區域性變數型別推斷Var的用法 - foojayJava變數型別
- let const var 區別
- var let const區別
- let,const,var區別
- ES6中的let與var的區別
- Go 中 type var string 和 type var = string 的區別Go
- es6 let const與var 的區別
- 淺談let和var的區別
- var、let和const的區別
- var和let/const的區別
- 教你理解let和var的區別
- js中var和let的快速區別JS
- JavaScript中let、const、var 的區別JavaScript
- 1.變數:var,let,const變數
- var_dump-列印變數的相關資訊變數
- JavaScript中的var、let 及 const 區別JavaScript
- JS中const、var 和let的區別JS
- echoprint()print_r()var_dump()的區別
- 你還在用var定義變數嗎?變數