1. 程式人生 > 程式設計 >js裡面的變數範圍分享

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關鍵詞申明,所以預設用的是全域性的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>

解釋性文字都寫在程式碼裡面,大家搞不懂,可以執行下,就到這了