JavaScript變量介紹

如何在Java$cript中定義變量?
使用var關鍵字,當然你可以什麼都不用,當這個標識符第一次使用的時候這個變量也聲明瞭,可這並不是一個好習慣。從這個可以看出Java$cript是一個弱類型的語言,也就是不進行類型檢查。比如,你將5賦值給“i”這個變量,過一會兒你可以將"abcdefg"這個字符串賦給“i”,這沒有任何問題。如下:

var i = 5;
i = "abcdefg";

我們來瞅瞅聲明變量的各種方式:
var i;//這個時候你聲明瞭i這個變量,但是它的值是 undefined
var sum;
var i,sum;
var i = 1,sum = 20,a;
上面看起來變量聲明還比較簡單,但是這裏卻有巧妙的機關,是否使用var和在哪裏使用會影響到變量的作用域,也就是常說的scope。(解釋一下啥叫變量的作用域,變量的作用域就是變量的生命週期,一個變量聲明後並不是一直存在於程序中,隨着你的程序的執行,你的變量也許就會消失在迷途中)我們來瞧瞧:
一般變量有兩種作用域:全局變量(也就是說它存在於你的程序的everywhere),還有一個是局部變量(局部變量就是在方法中聲明的變量,它只生活在這個方法體中,在方法外就不能訪問了)
這裏有一些注意點:如果在一個方法中,有一個局部變量和一個全局變量同名,那麼優先使用這個局部變量
如下:
var test = "g"; //這是一個全局變量
check(){
var test = "l";//這是一個局部變量,但是它的名字卻和全局變量的相同,它會隱藏全局變量
alert(test);//不信,試試,肯定彈出的框框上面的值是 "l";
}
看到這個介紹,所以編寫程序的時候要留個心眼啊,儘量不要將全局變量和局部變量同名,不然會有一些怪異的行爲,不過我們有的時候卻故意讓它們同名,來實現一些小甜餅,呵呵。
下面還有一個怪異的地方,是關於是否使用var的問題。
在方法外聲明的變量叫做 全局變量,不管它是否使用了var關鍵字,但是在方法裏面的卻不同了,使用了var關鍵字的是局部,沒有使用的就是聲明瞭一個全局變量了

test = "g"; //沒有使用var吧,它也是聲明一個全局變量
check(){
test ="test";//這裏是不是聲明瞭一個同名的test局部變量呢?不是,這裏只改變了全局變量的值,因爲沒有
                    //var關鍵字
g = "abc"; //沒有var,這是聲明瞭一個新的全局變量
}
//不信?我們在方法外面測試一下
alert(test); //新的值爲test吧
alert(g);//是不是還能訪問?值位爲abc

關於Java$cript的變量還有個地方有點奇怪,在C等語言裏面有塊級局部變量,比如,在一個if 塊裏面定義一個變量,那麼這個變量的作用域就會在這個if塊裏面,離開if塊以後,這個變量就不能訪問了,但是在Java$cript裏卻沒有這個概念,看看:
check(){
   var a = 0;
  if (a == 1){
//在這個if塊裏面,我們定義了 j,並賦值爲 1
  var j = 1;
  }
//在if塊外面我們仍然能夠訪問j,顯示的值果然是1
alert(j);
}
這就是Java$cript 所謂的在方法裏面定義的變量可以影響到方法體的每個角落,就是因爲這個奇怪的影響引發了一個超級奇怪的現象:
var t = "test";//這裏我定義了一個全局變量
check(){
alert(t);//你說這裏應該顯示什麼?
var t = "la,la,la";//定義一個同名的局部變量吧
alert(t);//這裏又顯示什麼呢?
}
/告訴你吧,第一個alert顯示undefined,爲什麼,因爲Java$cript所謂的在方法裏面定義的變量可以影響到方法體的每個角落,由於後面有個定義了個局部變量,它影響到這裏來了(我覺得這影響也太管的寬了吧,呵呵),t在後面定義的,你這裏使用所以就顯示“未定義”了,唉,奇怪真奇怪。翻了很多資料,在Java$cript高級編程裏面發現,原來上面的語句被解釋成這個樣子:
check(){
var t;//原來Java 解釋的時候會把所有的聲明和賦值分開,並將聲明提前啊
alert(t);
t = "la,la,la";
alert(t);
}
Java$cript變量深入探討:
一、Java$cript和C,Java不一樣,它的變量是無類型的,所以Java$cript的變量可以保存任何類型的數據,一方面這帶來沒有類型檢查,類型檢查需要程序員自己來保證,另外一方面有沒有類型轉換的好處,這樣使得好多面向對象設計模式顯得不再重要。
二、關於Java$cript局部變量以及全局變量的問題,實際上在Java$cript內部維護着一個對象的鏈子,當要訪問一個變量的時候,就會從這個鏈子的頭部找到尾部,先在哪裏找到這個變量就是哪個對象的變量,而且是就近原則。
三、在Java$cript啓動解釋器開始解釋的時候,還沒有任何一行代碼執行的時候,解釋器會構造一個全局對象,解釋器會將所有的全局變量作爲這個對象的屬性,並且把向parseInt(),這樣的方法業作爲這個對象的方法,在客戶端Java$cript(比如瀏覽器中)裏,這個全局對象就是window

上面描述的是Java$cript變量的一些知識,關於變量還有一些更重要的東西,這就是變量的命名:國際知名對象大師Martin Flower在他的知名著作《重構》裏講過:誰都能寫出機器能夠讀懂的代碼,但是唯有能寫出人能夠讀懂的代碼纔是真正的程序員。鑑於這個,我上面所有的示例代碼都是不合格的,一個變量的命名要見名知意,看到了你變量的名字,就能知道你這個變量要幹什麼,保存的是什麼東西。這纔是成爲一位合格的程序員的基準。
OK,這篇文章就到這麼多吧,下次我們來聊聊Java$cript的流程控制。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章