一、塊級(jí)作用域的說(shuō)明
在學(xué)習(xí)JavaScript的變量作用域之前,我們應(yīng)當(dāng)明確幾點(diǎn):
a、JavaScript的變量作用域是基于其特有的作用域鏈的。
b、JavaScript沒(méi)有塊級(jí)作用域。
c、函數(shù)中聲明的變量在整個(gè)函數(shù)中都有定義。
javascript的變量作用域,與平時(shí)使用的類C語(yǔ)言不同,例如C#中的代碼:
static void Main(string[] args){ if(true) { int number=10; } Console.WriteLine(number);}這段代碼進(jìn)行編譯,是無(wú)法通過(guò)的,因?yàn)?當(dāng)前上下文不存在number".
因?yàn)檫@里變量的作用域是由花括號(hào)限定的,稱為塊級(jí)作用域。
在塊級(jí)作用域下,所有的變量都在定義的花括號(hào)內(nèi),從定義開始到花括號(hào)結(jié)束這個(gè)范圍內(nèi)可以使用,出了這個(gè)范圍就是無(wú)法訪問(wèn),也就是說(shuō)
if(true){ int number=10; Console.WriteLine(number);}這樣可以訪問(wèn),因?yàn)樽兞康亩x與使用在同一個(gè)花括號(hào)內(nèi)。
但是在javascript中沒(méi)有塊級(jí)作用域的概念。
二、javascript中的作用域
1、函數(shù)限定變量作用域
在javascript中,函數(shù)里面定義的變量,,可以在函數(shù)里面被訪問(wèn),但在函數(shù)外無(wú)法訪問(wèn),代碼:
<script type="text/javascript"> var num=function() { var number=10; }; try{ alert(number); }catch(e) { alert(e); } </script>代碼運(yùn)行時(shí),會(huì)拋出一個(gè)異常,變量number沒(méi)有定義,是因?yàn)槎x在函數(shù)中的變量無(wú)法再函數(shù)外使用,在函數(shù)內(nèi)可以任意使用,即使在賦值之前:
<script type="text/javascript"> var num=function(){ alert(number); var number=10; alert(number); }; try{ num(); }catch(e){ alert(e); }</script>這段代碼運(yùn)行后,不會(huì)拋出錯(cuò)誤,彈出兩次,分別是undefined和10
2.子域訪問(wèn)父域
函數(shù)可以限定變量的作用域,那么在函數(shù)中的函數(shù)就為該作用域的子域,在子域中的代碼可以訪問(wèn)到父域中的變量,代碼如下:
<script type="text/javascript"> var func=function(){ var number=10; var sub_func=function(){ alert(num); }; sub_func();};func();</script>這段代碼執(zhí)行得到的結(jié)果是10,但是在子域中訪問(wèn)父域的代碼也是有條件的
<script type="text/javascript"> var func=function(){ var number=10; var sub_func=function(){ var num=20; alert(num); }; sub_func();};func();</script>這段代碼比前面多了一個(gè)"var num=20;",這句代碼在子域中,那么子域訪問(wèn)父域的情況就發(fā)生了變化,這段代碼打印的結(jié)果是20,此時(shí)子域訪問(wèn)的num是子域中的變量,而不是父域中的。由此可見(jiàn)訪問(wèn)有一定規(guī)則可言,在javascript中使用變量,javascript解釋器首先在當(dāng)前作用域中搜索是否有該變量的定義,如果有,就是用這個(gè)變量,如果沒(méi)有就到父域中尋找變量,依次類推,直到最頂級(jí)作用域,仍然沒(méi)有找到就拋出異常"變量未定義",代碼如下:
新聞熱點(diǎn)
疑難解答
圖片精選