在js裡的全域性環境就是乙個物件,這個物件也是js執行的根,對瀏覽器中的js,這個物件就是window物件。對全域性js語句來說,window物件就相當於當前作用域。
當我們寫下:
var
myjs=
'start'
;
就是定義了window作用域的乙個變數myjs,當我們這樣寫:
myjs=
'start'
;
就是定義了window作用域的乙個屬性myjs。
從上面看,window作用域的乙個變數myjs與window作用域的乙個屬性myjs幾乎等價,對於全域性的js語句來說加var與不加沒什麼區別,但在函式體內的語句加與不加就有區別了。
從上面我們可以看出有var 修飾的在函式內外表現出兩個東西,沒有var修飾的只表現出乙個東西,它的值函式內外都可以改變。上面有個undefined大家應該會覺得很奇怪,為什麼不是c#。上面說過,在js全域性語句中有var 的就是乙個變數,沒有的就是乙個屬性。變數是有作用域的,**進去下面的函式中,就相當於在當前作用域中建立了乙個子作用域。js引擎首先會把自定義函式建立為作用域上的變數函式,對所有的var 定義的變數,預編譯的時候都會定義為undefined,js遇到變數和函式時會首先在當前作用域找,沒找到再往上層找,而var mylike = 'js';說明已經存在,初始值定義為undefined,var mylike = 'js'賦值在輸出的後面,所以為undefined。
JS 作用域 var與let 區別
在es6入門時,最讓人傻傻分不清楚的就是var與let帶來的作用域的苦惱。最近又一次翻看阮一峰老師的文章,重新有了自己的小結。分析 var a for var i 0 i 10 i a 6 10var a for let i 0 i 10 i a 6 6以上兩段 區別在於var與let使用的作用域不...
作用域變數 var
var沒有塊級作用域,定義後在當前閉包中都可以訪問,如果變數名重複,就會覆蓋前面定義的變數,並且也有可能被其他人更改。變數名重複,就會覆蓋前面定義的變數,並且也有可能被其他人更改 console.log a function a function a 輸出 2 定義後在當前閉包中都可以訪問 if t...
var和let 以及js作用域問題
今天學習es6 的時候發現了var 和 let 之間的不同。var a for var i 0 i 10 i a 6 6 var設定的是全域性變數。陣列中儲存的是指向i的記憶體位址,所以在迴圈中i一直在變化,最後在10就不動了。let設定的是區域性變數,宣告的變數僅在塊級作用域內有效。變數i只在本輪...