變數的型別
Javascript和Java、C這些語言不同,它是一種無型別、弱偵測的語言。它對變數的定義並不需要宣告變數類型,我們只要透過賦值的形式,可以將各種類型的資料賦值給同一個變數。例如:
i=100;//Number类型 i="variable";//String类型 i={x:4};//Object类型 i=[1,2,3];//Array类型
JS的這種特性雖然讓我們的編碼更加靈活,但也帶來了一個弊端,不利於Debug,編譯器的弱檢測讓我們維護冗長的程式碼時相當痛苦。
全域變數與局部變數
當JS解析器執行時,首先就會在執行環境中建構一個全域對象,我們定義的全域屬性就是做為該對象的屬性讀取,在頂層程式碼中我們使用this關鍵字和window物件都可以存取到它。而函數體中的局部變數只在函數執行時產生的呼叫物件中存在,函數執行完畢時局部變數即刻銷毀。因此在程式設計中我們需要考慮如何合理聲明變量,這樣既減小了不必要的記憶體開銷,同時能很大程度地避免變量重複定義而覆蓋先前定義的變量所造成的Debug麻煩。
變數作用域
任何程式語言中變數的作用域都是一個很關鍵的細節。 JS中變數的作用域相對與JAVA、C這類語言顯得更自由,一個很大的特徵就是JS變數沒有區塊級作用域,函數中的變數在整個函數中都有效,運行下面程式碼:
<SCRIPT LANGUAGE="JavaScript" type="text/javascript"> //定义一个输出函数 function outPut(s){ document.writeln(s) } //全局变量 var i=0; //定义外部函数 function outer(){ //访问全局变量 outPut(i); // 0 //定义一个类部函数 function inner(){ //定义局部变量 var i = 1; // i=1; 如果用隐式申明 那么就覆盖了全局变量i outPut(i); //1 } inner(); outPut(i); //0 } outer(); </SCRIPT>
輸出結果為0 1 0,從上面就可以證明JS如果用var在函數體中聲明變量,那麼此變量在且只在該函數體內有效,函數運行結束時,本地變量即可銷毀了。
由於上面的這個JS特性,還有一個關鍵的問題要注意。先前一直使用ActionScript,雖然它和JS都是基於ECMA標準的,但在這裡還是略有不同的。例如下面程式碼:
<SCRIPT LANGUAGE="JavaScript" type="text/javascript"> //定义一个输出函数 function outPut(s){ document.writeln(s) } //全局变量 var i=0; //定义外部函数 function outer(){ //访问全局变量 outPut(i); // 0 //定义一个类部函数 function inner(){ outPut(i); //undefiend var i=1; outPut(i); //1 } inner(); outPut(i); //0 } outer(); </SCRIPT>
JS變數作用域
<script language ="javascript" type ="text/javascript" > var a = "change"; function fun() { alert(a);//输出undefined var a = "改变了"; alert(a);//输出改变了 } alert(a);//输出change fun(); </script>
var定義的是作用域上的變數,在第一次輸出a之前,JS在預編譯分析中已經將a賦值為change,所以第一次輸出change,當呼叫到fun()函數的時候,JS建立一個新的作用域,在輸出a之前,初始化所有var變數的值為undefined,所以fun()中第一次輸出的是undefined,第二個輸出已經給a賦值了,所以輸出新的值;兩個a在函數裡面和外面是不同的兩個變量,如:
<script language ="javascript" type ="text/javascript" > var b; function fun() { b = "change"; } alert(b);//输出undefined </script>
變數b在函數外面已經定義了,在函數中有給b賦值,但輸出的卻是undefined。
以上是如何更好的理解javascript變數類型以及變數作用域的詳細內容。更多資訊請關注PHP中文網其他相關文章!