js里面的變量范圍分享
更新時間:2020年07月18日 22:06:15 作者:鍵盤鋼琴師
今天寫一個滑動自動加載的功能的時候,遇到了切換就發(fā)現(xiàn)加載完畢的情況,查看了下發(fā)現(xiàn)可能是js的全局變量和局部變量的問題,自己測試了下,果不其然,下面分享下
先上兩段代碼
<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關(guān)鍵詞申明,所以默認用的是全局的i的值,在全局里面改變?nèi)肿兞康闹?,所以全局變量i的值被修改成1了。
下面再多看幾個demo
<script> /*這個很簡單,就是改變?nèi)值闹?/ 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里已經(jīng)聲明了,var i = 1;所以全局的i被覆蓋了,這說明了js在執(zhí)行前會對整個腳本文件的定義部分做完整分析,所以在test()函數(shù)執(zhí)行前,函數(shù)體中的變量i都已經(jīng)被指向了內(nèi)部的局部變量,而不是指向外部的全局變量,但這是i還沒有申明和賦值,所以彈的是undefined。(從刀刀的專欄(http://blog.csdn.net/zyz511919766/article/details/7276089)得知) var i = 1; alert(i);//彈框1 這里已經(jīng)賦值了1,然后在函數(shù)體里面,所以彈值是1 } test(); alert(i);//彈框2 因為局部變量不會影響全局變量,所以這里彈的值是2 </script>
<script> var i =1; function test(){ alert(i);//undefined 這個上一段代碼已經(jīng)說了,js會先做解析,只要有var,就會只想局部變量,但是這個時候同樣還沒定義和賦值,所以undefined i=2; alert(i)//2 已經(jīng)賦值了,所以是2 var i; alert(i);//2 這里還是2.因為在前面已經(jīng)把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>
解釋性文字都寫在代碼里面,大家搞不懂,可以運行下,就到這了
相關(guān)文章
無閃爍更新網(wǎng)頁內(nèi)容JS實現(xiàn)
這篇文章主要介紹了無閃爍更新網(wǎng)頁內(nèi)容JS實現(xiàn),有需要的朋友可以參考一下2013-12-12springMvc 前端用json的方式向后臺傳遞對象數(shù)組方法
今天小編就為大家分享一篇springMvc 前端用json的方式向后臺傳遞對象數(shù)組方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08