js裡面的變數範圍分享
阿新 • • 發佈:2020-07-20
先上兩段程式碼
<script> var i = 2; function test(){ var i = 1; } test(); alert(i);//值為2 </script>
<script> var i = 2; function test(){ i = 1; } test(); alert(i);//值為1 </script>
是不是覺得很奇怪,我當時也是這樣搞暈了,程式碼沒問題啊,咋回事,最後找了找,原來是var作怪。我自己的理解是,var是用來申明變數的,在方法體裡面申明的就是區域性變數,區域性變數自然不會影響到全域性變數的值了。所以第一段程式碼alert出來的是2;第二段由於沒有用var關鍵詞申明,所以預設用的是全域性的i的值,在全局裡面改變全域性變數的值,所以全域性變數i的值被修改成1了。
下面再多看幾個demo
<script> /*這個很簡單,就是改變全域性的值*/ var i = 2; function test(){ alert(i);//彈框2 i = 1; alert(i);//彈框1 } test(); alert(i);//彈框1 </script>
<script> /*這裡就有點奇怪了,為啥第一個alert彈框是undefine呢?*/ var i = 2; function test(){ alert(i);//彈框undefined,查了下,這個i不是全域性變數,因為在function scope裡已經聲明瞭,var i = 1;所以全域性的i被覆蓋了,這說明了js在執行前會對整個指令碼檔案的定義部分做完整分析,所以在test()函式執行前,函式體中的變數i都已經被指向了內部的區域性變數,而不是指向外部的全域性變數,但這是i還沒有申明和賦值,所以彈的是undefined。(從刀刀的專欄(http://blog.csdn.net/zyz511919766/article/details/7276089)得知) var i = 1; alert(i);//彈框1 這裡已經賦值了1,然後在函式體裡面,所以彈值是1 } test(); alert(i);//彈框2 因為區域性變數不會影響全域性變數,所以這裡彈的值是2 </script>
<script> var i =1; function test(){ alert(i);//undefined 這個上一段程式碼已經說了,js會先做解析,只要有var,就會只想區域性變數,但是這個時候同樣還沒定義和賦值,所以undefined i=2; alert(i)//2 已經賦值了,所以是2 var i; alert(i);//2 這裡還是2.因為在前面已經把2賦值給i了 } test(); alert(i);//1 彈全域性的值,毫無疑問 </script>
<script> /**如果我們方法體裡面變數名是一樣,但是我又要用到全域性的變數怎麼辦呢**/ var i =1; function test(){ var i = 2; alert(i);//這裡是2,不解釋 alert(window.i);//這裡是1 因為用window.globalVariableName方式可以訪問到全域性的i } test(); alert(i);//這裡是1,不解釋 </script>
解釋性文字都寫在程式碼裡面,大家搞不懂,可以執行下,就到這了