javascript中局部變量和全局變量的區別詳解

javascript有兩種變量:局部變量和全局變量。固然,咱們這篇文章是幫助你們真正的區別這兩種變量。javascript

首先,局部變量是指只能在本變量聲明的函數內部調用。全局變量時整個代碼中均可以調用的變量。固然,單單從字面上理解確定是不清楚的,下面我詳細的介紹下:
你們都知道,變量是須要用var關鍵字聲明的。可是javascript中也能夠隱式的使用變量,就是不用聲明,直接使用。並且,千萬注意,javascript把隱式聲明的變量老是當成全局變量來使用的。
例如:java

 

複製代碼 代碼以下:函數


function myName() {
 i = 'yuanjianhang';
}
myName();
function sayName() {
 alert(i);
}
sayName();.net

 

輸出結果爲:yuanjianhanghtm

這說明變量i就是一個全局的變量,若是把上面的代碼改爲以下:ip

 

複製代碼 代碼以下:io


function myName() {
 var i='yuanjianhang';
}
myName();
function sayName() {
 alert(i);
}
sayName();function

 

此時,遊覽器將沒有任何輸出結果,由於i 是在函數myName中定義的,因此它只是myName的局部變量,不可能被外部調用。
 
如今再回過頭來看下面的代碼:變量

 

複製代碼 代碼以下:script


function myName() {
 i = 'yuanjianhang';
}
myName();
function sayName() {
 alert(i);
}
sayName();

 

如今,咱們進行一下改動,把myName();去掉,代碼以下:

 

複製代碼 代碼以下:


function myName() {
 i = 'yuanjianhang';
}
function sayName() {
 alert(i);
}
sayName();

 

 此時,遊覽器也不會有如何反應。由於雖然i是全局變量,可是函數myName()並無被調用,因此就至關於雖然聲明瞭i,可是並無給i賦予任何的值,因此沒有任何輸出。
同理,若是把上例改爲:
 

複製代碼 代碼以下:


function myName() {
 
 i = 'yuanjianhang';
}
function sayName() {
 alert(i);
}
sayName();
myName();

 

這種狀況下仍是不會輸出任何結果,javascript代碼的執行時從上到下的,在sayName()函數被調用時會檢查變量i的值,此時函數myName還沒有執行,也就是說i尚未被賦值,因此不會輸出任何結果。
 
爲了方便你們更好的理解,這裏再舉一個例子:

 

複製代碼 代碼以下:


var i = 'yuanjianhang';
function myloveName() {
 i = 'guanxi';
}
myloveName();
function myName() {
 alert(i);
}
myName();

 

此次的結果是什麼呢?
答案是guanxi
首先,i的原始值是yuanjianhang,可是當調用myloveName()函數以後,將i的值改成guanxi,因此最後的輸出結果是guanxi。

若是將代碼改成:

 

複製代碼 代碼以下:


var i = 'yuanjianhang';
function myloveName() {
 var i = 'guanxi';
}
myloveName();
function myName() {
 alert(i);
}
myName();

 

此時的結果就是yuanjianhang了,由於代碼中的兩個i不同,一個是全局的,一個是局部的,也能夠這樣理解,雖然兩個i的名字同樣,可是這兩個i的本質卻不同,好像有兩個名字同樣的人同樣,雖然名字同樣,但卻不是同一我的。

若是將代碼改形成這樣:

 

複製代碼 代碼以下:


var i = 'yuanjianhang';
function myloveName() {
 i = 'guanxi';
}
function myName() {
 alert(i);
}
myName();
myloveName();

 

相信你們能夠本身算出結果了,結果是yuanjianhang。

既然函數內部能夠調用全局變量,那麼下面這種狀況呢:

 

複製代碼 代碼以下:


var i = 'yuanjianhang';
function myloveName() {
  i = 'guanxi';
 alert(i);
}
myloveName();

 

此時變量的值是哪一個呢?

咱們來分析下:

首先全局變量i被賦值爲:yuanjianhang。

接下來myloveName()函數被調用,全局變量i被從新賦予新的值:guanxi

因此結果確定是:guanxi。

若是咱們把alert提早呢,像這樣:

 

複製代碼 代碼以下:


var i = 'yuanjianhang';
function myloveName() {
  alert(i);
 i = 'guanxi';
}
myloveName();

 

這時候結果是什麼呢?
通過驗證結果是:undefined
若是代碼是這樣呢:

 

複製代碼 代碼以下:


var i = 'yuanjianhang';
function myloveName() {
  alert(i);
}
myloveName();

 

此時i的結果是:yuanjianhang

爲何會發生上面undefined狀況,由於代碼的執行順序是從上到下的,在輸出i以前並無對i定義。因此從這裏能夠看出,使用代碼的時候,變量的聲明必定要放到代碼的前面,以免出現相似的問題!

同理:

 

複製代碼 代碼以下:


var i = 'yuanjianhang';
function myloveName() {
 alert(i);
 var i = 'guanxi';
 
}
myloveName();

 

這種狀況下也會輸出:undefined

更多例子以下:

http://www.jb51.net/article/61442.htm

相關文章
相關標籤/搜索