這篇文章主要介紹了Javascript核心讀書有感之語句,需要的朋友可以參考下
在javascript中,表達式是短語,那麼語句(statement)就是整句或命令。正如英文語句以句號結尾,javascript以分號結尾。
表達式計算出一個值,但語句使某件事發生。
“使某件事發生”的一個方法是計算帶有副作用的表達式。諸如賦值和函數調用這些有副作用的表達式,是可以作為單獨的語句的。這種把表達式當做語句的用法也稱做表達式語句(expression statement)。類似的語句還有聲明語句(declaration statement),聲明語句用來聲明新變量或者定義新函數。
javascript程序就是一系列的可執行語句的集合,默認情況下,javascript解釋器依照編寫順序依次執行。另一種“使某件事情”發生的方法就是改變語句的默認執行順序:
1.條件語句(conditional)語句:javascript解釋器可以根據一個表達式的值來判斷;來執行還是跳過這些語句,例如if和switch語句。
2.循環語句(loop)語句:可以重復執行的語句,例如while和for語句
3.跳轉(jump)語句:可以讓解釋器跳轉至程序的其它部分繼續執行、例如break、return和throw語句
接下來本文將介紹javascript中各式各樣的語句和其語法。本章最後對這些語句做了總結。一個javascript程序無非是以分隔分割的語句集合,所以一旦掌握了javascript語句,就可以編寫javascript程序了。
1.表達式語句
賦值語句是一種比較重要的表達式語句,它的作用就是改變一個變量的值,就像執行一條賦值語句一樣:例如
代碼如下:
遞增運算符(++)和遞減運算符(--)和賦值語句有關。它們的作用是改變一個變量的值,就像執行一條賦值語句一樣。
代碼如下:
delete運算符的重要作用就是刪除一個對象的屬性(或數組的元素),所有它一般作為語句使用,而不是作為復雜表達式的一部分。
代碼如下:
函數調用是表達式語句的另外一個大類,例如
代碼如下:
雖然這些客戶端函數都是表達式,但它們對web浏覽器造成了一定的影響。所以我們認為也是語句,調用一個沒有副作用的函數是沒有意義的,除非它是復雜的表達式或賦值語句的一部分,例如。不可能隨便把一個余弦值丟棄;
Math.cos(x);
相反,得出余弦值就得把它賦值給一個變量,以便將來使用這個值:
var cx = Math.cos(x);
再次提醒各位,每行代碼就是以分號結束的。
2.復合語句和空語句
可以用逗號運算符將幾個表達式連接在一起,形成一個表達式。同樣,javascript還可以講多條語句聯合在一起,形成一個復合語句(compound statement)。只需花括號將多條語句括起來即可。因此,下面幾行代碼可以當成一條單獨的語句,使用在javascript任何希望使用一條語句的地方。
代碼如下:
關於語句塊有幾點需要注意:第一,語句塊不需要分號。塊中的元素語句必須以分號結尾,但語句塊不需要。
第二,語句塊中的行都有縮進,這不是必須的,但整齊的縮進能使代碼可讀性更強,更容易理解。
第三,javascript沒有塊級作用域,在語句塊中聲明的變量並不是語句塊所私有的。(參考3章10節第一小節)
將很多條語句合並成一個大語句塊的做法在javascript編程中非常常見。類似的表達式通常包含子表達式一樣,很多javascript包含其它子語句,從形式來講,javascript通常允許一個語句塊包含一條子語句。例如:while循環的循環體就可以只包含一條語句。使用語句塊,可以將任意數量的語句放到這個塊中,這個語句塊可以當做一條語句來使用。
在javascript中,當希望多條語句被當做一條語句使用時,使用符合語句來替代。空語句(empty statement)則恰好相反,它允許包含0條語句。空語句如下所示:
;//分號
javascript解釋器在執行空語句時顯然不執行任何動作,但實踐證明:當創建一個具有空循環體的循環時,空語句有時是很有用的,例如下面的for循環
代碼如下:
在這個循環中,所有的操作都在表達式a[i++]=0中完成,這裡並不需要任何循環體。然而javascript需要循環體中至少包含一條語句,因此這裡只使用了一個單獨的分號來表示一條空語句。
注意,在for循環、while循環或if語句的右邊園括號的分號很不起眼,這很可能造成 一些致命的bug,而這些bug很難定位到。例如下面的代碼的執行結果很可能就是作者不想要的效果:
代碼如下:
如果有特殊目的使用空語句,最好在代碼中添加注釋,這樣能更清楚的說明這條空語句是有用的
代碼如下:
3.聲明語句
var和function都是聲明語句,它們聲明或定義變量或函數。這些語句定義標識符(變量名和函數名)並給其賦值,這些標識符可以在程序任意地方使用。聲明語句本身什麼也不做,但它有一個重要意義:通過創建變量和函數,可以更好的組織代碼的語義。
接下幾節將講述var語句和function語句,但並不包含變量和函數的全部內容。
i.var
var語句用來聲明一個或者多個變量,它的語法如下:
var name_1[ = value_1][, ..., name_n[ = value_n]]
關鍵字var之後跟隨的是要聲明的變量列表,列表中的每一個變量都可以帶有初始化表達式,可用於指定它的初始值。例如:
代碼如下:
如果var語句出現在函數體內,那麼定義的是一個局部變量,其作用域就是這個函數。如果在頂層代碼中使用var語句,那麼它聲明的是全局變量,在整個javascript中,都是可見的。在第三章10節提到:全局變量是全局對象的屬性,然後和其它全局對象屬性不同的是,var聲明的變量是無法通過delete刪除的。
如果var語句中的變量沒有指定初始化表達式,那麼這個變量的值初始為undefined。所以,在聲明語句之前的變量值就是undefined。
需要注意的是,var語句同樣可以作為for循環或者for/in循環的組成部分。(在循環之前聲明的變量聲明一樣,這裡聲明變量也會"提前"),例如:
代碼如下:
注意,多次聲明同一變量是無所謂的。
ii.function
關鍵字function用來聲明函數的,我們已經學過函數表達式(4.3).函數定義可以寫成語句的形式。例如:下面示例代碼中的兩種定義寫法:
代碼如下:
函數聲明的語法如下:
代碼如下:
funcname是要聲明的函數的名稱標識符。函數名之後是參數列表,參數之間使用逗號隔開。當調用函數的時候,這些標識符則指代傳入函數的實參。
函數體是由javascript語句組成的,語句數量不限,且用花括號括起來。在定義函數時,並不執行函數體內的語句,它和調用函數時待執行的新函數對象相關聯。注意,function函數語句裡的花括號是必須的,這和while循環和其它一些語句鎖使用的語句塊是不同的,即使函數體只有一條語句,仍然需要花括號將其括起來。
代碼如下:
函數的聲明通常出現在javascript代碼的最頂部,也可以嵌套在其他函數體內。但在嵌套時,函數聲明只能出現在所嵌套的函數頂部。也就是說:函數定義不能出現在if、while、或其他語句中。
和var語句一樣,函數聲明語句創建的變量也是不可刪除的。但是這些變量不是只讀的,變量值可以重寫。
4.條件語句
條件語句是通過判斷指定的表達式的值是否來執行或跳過某些語句。這些語句是代碼的”決策點“,有時稱為”分支&ldq