j**ascript有兩種變數:區域性變數和全域性變數。當然,我們這篇文章是幫助大家真正的區別這兩種變數。
首先,區域性變數是指只能在本變數宣告的函式內部呼叫。全域性變數時整個**中都可以呼叫的變數。當然,單單從字面上理解肯定是不清楚的,下面我詳細的介紹下:
大家都知道,變數是需要用var關鍵字宣告的。但是j**ascript中也可以隱式的使用變數,就是不用宣告,直接使用。而且,千萬注意,j**ascript把隱式宣告的變數總是當成全域性變數來使用的。
例如:複製** **如下:
function myname()
myname();
function sayname()
sayname();
輸出結果為:abc
這說明變數i就是乙個全域性的變數,如果把上面的**改成如下:
複製** **如下:
function myname()
myname();
function sayname()
sayname();
此時,遊覽器將沒有任何輸出結果,因為i 是在函式myname中定義的,所以它只是myname的區域性變數,不可能被外部呼叫。
現在再回過頭來看下面的**:
複製** **如下:
function myname()
myname();
function sayname()
sayname();
現在,我們進行一下改動,把myname();去掉,**如下:
複製** **如下:
function myname()
function sayname()
sayname();
此時,遊覽器也不會有如何反應。因為雖然i是全域性變數,但是函式myname()並沒有被呼叫,所以就相當於雖然宣告了i,但是並沒有給i賦予任何的值,所以沒有任何輸出。
同理,如果把上例改成:
複製** **如下:
function myname()
function sayname()
sayname();
myname();
這種情況下還是不會輸出任何結果,j**ascript**的執行時從上到下的,在sayname()函式被呼叫時會檢查變數i的值,此時函式myname尚未執行,也就是說i還沒有被賦值,所以不會輸出任何結果。
為了方便大家更好的理解,這裡再舉乙個例子:
複製** **如下:
var i = 'abc';
function mylovename()
mylovename();
function myname()
myname();
這次的結果是什麼呢?
答案是a
首先,i的原始值是abc,但是當呼叫mylovename()函式之後,將i的值改為a,所以最後的輸出結果是a。
如果將**改為:
複製** **如下:
var i = 'abc';
function mylovename()
mylovename();
function myname()
myname();
此時的結果就是abc了,因為**中的兩個i不一樣,乙個是全域性的,乙個是區域性的,也可以這樣理解,雖然兩個i的名字一樣,但是這兩個i的本質卻不一樣,好像有兩個名字一樣的人一樣,雖然名字一樣,但卻不是同乙個人。
如果將**改造成這樣:
複製** **如下:
var i = 'abc';
function mylovename()
function myname()
myname();
mylovename();
相信大家可以自己算出結果了,結果是abc。
既然函式內部可以呼叫全域性變數,那麼下面這種情況呢:
複製** **如下:
var i = 'abc';
function mylovename()
mylovename();
此時變數的值是哪個呢?
我們來分析下:
首先全域性變數i被賦值為:abc。
接下來mylovename()函式被呼叫,全域性變數i被重新賦予新的值:a
所以結果肯定是:a
如果我們把alert提前呢,像這樣:
複製** **如下:
var i = 'abc';
function mylovename()
mylovename();
這時候結果是什麼呢?
經過驗證結果是:undefined
如果**是這樣呢:
複製** **如下:
var i = 'abc';
function mylovename()
mylovename();
此時i的結果是:abc
為什麼會發生上面undefined情況,因為**的執行順序是從上到下的,在輸出i之前並沒有對i定義。所以從這裡可以看出,使用**的時候,變數的宣告一定要放到**的前面,以避免出現類似的問題!
同理:複製** **如下:
var i = 'abc';
function mylovename()
mylovename();
這種情況下也會輸出:undefined
好了,關於變數我只有這麼多的介紹了,相信這些任何人都可以看明白。不管**如何複製,其核心是不會變的。
js區域性變數 全域性變數
在js中如果用var來定義乙個變數,如果該變數被定義在function或者其他迴圈體內,則變數為區域性變數,並且該變數不會受到同名全域性變數的影響,也不會影響同名的全域性變數。如果不用var來定義變數而直接拿乙個變數來使用則該變數會被自己定義為全域性變數,無論該變數被定義在任何位置,如果在funct...
全域性變數 靜態全域性變數 靜態區域性變數 區域性變數
全域性和靜態變數都在堆裡。這句話應該錯了,應該是放在常量資料段 全域性變數的作用範圍是整個程式 如果程式是多個檔案,必須在其他的檔案中說明 靜態變數的作用範圍要看靜態變數的位置,如果在函式裡,則作用範圍 就是這個函式。靜態全域性變數,只在本檔案可以用,雖然整個程式包含多個檔案,但靜態全域性變數只能用...
全域性變數 靜態全域性變數 靜態區域性變數 區域性變數
全域性和靜態變數都在堆裡。全域性變數的作用範圍是整個程式 如果程式是多個檔案,必須在其他的檔案中說明 靜態變數的作用範圍要看靜態變數的位置,如果在函式裡,則作用範圍 就是這個函式。靜態全域性變數,只在本檔案可以用,雖然整個程式包含多個檔案,但靜態全域性變數只能用在定義它的那個檔案裡,卻不能用在程式中...