JavaScript之語句

摘要

JavaScript程序無非就是一系列可執行語句的集合。

複合語句和空語句

語句塊的結尾不需要分號。塊中的原始語句必須以分號結束,但語句塊不需要。
JavaScript中沒有塊級作用域,在語句塊中聲明的變量不是語句塊私有的。

在創建一個具有空循環體的循環時,空語句有時是很有用的。
for(var i=0;i<a.length;a[i++]=0) //初始化數組

如果是有特殊摩的的需要而使用空語句,最好在代碼中添加住宿,這樣可以更清楚地說明這條空語句的作用。


聲明語句

在普通模式下,多次聲明同一個變量是無所謂的。

function的花括號是必要的,就算函數只有一條語句,也需要

函數聲明語句通常出現在JavaScript代碼的最頂層,也可以嵌套在其他函數題內。但是嵌套式,函數聲明只能出現在所嵌套函數的頂部。也就是說,函數定義不能出現在if語句、for語句或其他任何語句中

儘管函數聲明語句和函數定義表達式包含有相同的函數名,但兩者仍然不同。兩種方式都創建了新的函數對象,但是函數聲明語句中但函數名是一個變量名,變量指向函數對象。和通過var聲明變量一樣,函數定義語句中的函數被顯式地提前到了腳本或函數的頂部。因此它們在整個腳本或函數內都是可見的。而如果使用var的話(函數聲明),只有變量聲明提前——變量的初始化代碼依舊停留在原位置。而函數定義則是函數名稱和函數體都被提前,也就是說,可以在聲明一個JavaScript函數前調用它。


條件語句

else if 語句不是真正的JavaScript語句,只不過是多條if/else語句連在一起時的一種慣用寫法

當指向switch語句的時候,它首先計算expression的值,然後查找case子句中的表達式是否和expression的值相同(本處是按嚴格相等算的)

在switch中,case指數指明瞭要執行代碼的起點,並沒有指明終點。

如果在函數中使用switch語句,可以使用return來代替break,return和break多用來終止switch語句,也會防止一個case語句塊執行完後繼續指向下一個case語句塊

最安全的做法是在case表達式中使用常量表達式

循環

do循環需要以分號結尾。

在執行for/in語句的過程中,JavaScript解釋器首先計算object表達式,如果表達式爲null或undefined,JavaScript解釋器將會跳過循環器並執行後續的代碼。如果表達式等於一個原始值,則會被轉換爲與之相對應的包裝對象。

只要for/i循環中variable的值可以當作複製表達式可以當作賦值表達式的左值,它可以是任意表達式。
var o = {x:1,y:2,z:3};
var a =[],i=0;
for (a[i++] in o);
for (i in a) console.log(a[i]);
//x y z
可以看到,上述代碼實際上產生的賦值,它將一個對象的屬性複製到一個數組中。

實際上,for/in循環並不會便利對象所有的屬性,只有”可枚舉“的屬性纔會遍歷到。
如果for/in的循環體刪除來還未枚舉的屬性,那麼該屬性將不會再被枚舉到。如果循環體定義來對象的新屬性,這些屬性通常也不會枚舉到。

ES規範並沒有指定for/in循環按照和中順序來枚舉對象類型,但實際上,主流的瀏覽器廠商都是按照屬性定義的先後順序來枚舉見到對象的屬性。如果是以對象直接量的形式創建對象,則將按照直接量中屬性的出現順序枚舉。

除了所有非繼承“自有”屬性以外的繼承屬性都往往是可枚舉的。
JavaScript的一些(並非全部)實現依照數字順序來枚舉數組類型,而不是某種特定的順序。但當數組元素的索引是非數字或是不連續的,則按照特定順序枚舉。

break,continue是JavaScript中唯一可以使用語句標籤的語句。

這裏用作標籤的identifier必須是一個合法的JavaScript標識符,而不能是一個保留字。標籤的命名空間和變量或函數的命名空間是不同的,因此可以使用同一個標識符作爲語句標籤和作爲變量名或函數名。

在兩個代碼段互不嵌套的情況下是可以出現同名的語句標籤。

當循環終止掉進非常複雜時,在函數體內使用break語句實現這些條件判斷要比寫在循環表達式中的終止條件要簡單得多。

當沒有任何閉合語句塊指定來break所用的標籤,這時會產生一個語法錯誤。break可以跳出任何閉合的語句塊。

不管break語句帶不帶標籤,它都只能在循環體內使用。在其他地方使用將會報語法錯誤。

由於continue在着兩種循環的行爲表現不同,因此使用while循環不可能完美地模擬實現for循環。

return語句只能在函數體內出現,如果不是的話會報語法錯誤。

一個Error對象有一個name屬性表示錯誤類型,一個message屬性用來存放傳遞給構造函數的字符串。

catch子句中的標識符具有塊級作用域,它只在catch語句塊內有定義。

只要try語句中有代碼執行來。finally從句就會執行。它通常在try從句的代碼後用於清理工作。

由return,continue,break語句使解釋器跳出語句塊時,解釋器在執行新的目標代碼之前現執行finally的邏輯,然後向上傳播這個一次,直到找到能處理這個異常的catch從句。

如果finally塊使用了return、continue、break或者throw語句使程序發生跳轉,或者通過調用拋出異常改變了程序執行流程,都以finally爲準。

在沒有catch從句的情況下try從句可以和finally從句一起使用。

就算有finally,依舊無法用while替代for

其他語句類型

嚴格模式下禁止使用with

只有在查找標識符的時候纔會用到作用域鏈,創建新的變量的時候不使用。
with語句提供了讀取屬性的快捷方法,但不能創建屬性(與全局無異)

debugger只有在調試器啓動的情況下有效

"use strict"只能出現在腳本代碼的開始或函數體的開始、任何實體語句之前,但不一定是首行。

嚴格模式下函數的this爲undefined而不是全局變量
發佈了92 篇原創文章 · 獲贊 30 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章