萬盛學電腦網

 萬盛學電腦網 >> 腳本專題 >> javascript >> Javascript核心讀書有感之語句

Javascript核心讀書有感之語句

 這篇文章主要介紹了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.表達式語句

賦值語句是一種比較重要的表達式語句,它的作用就是改變一個變量的值,就像執行一條賦值語句一樣:例如

 

代碼如下:
greet = "hello" + name;
i *= 3;

 

遞增運算符(++)和遞減運算符(--)和賦值語句有關。它們的作用是改變一個變量的值,就像執行一條賦值語句一樣。

 

代碼如下:
counter++;

 

delete運算符的重要作用就是刪除一個對象的屬性(或數組的元素),所有它一般作為語句使用,而不是作為復雜表達式的一部分。

 

代碼如下:
delete o.x;

 

函數調用是表達式語句的另外一個大類,例如

 

代碼如下:
alert(greet);
window.close();

 

雖然這些客戶端函數都是表達式,但它們對web浏覽器造成了一定的影響。所以我們認為也是語句,調用一個沒有副作用的函數是沒有意義的,除非它是復雜的表達式或賦值語句的一部分,例如。不可能隨便把一個余弦值丟棄;

Math.cos(x);

相反,得出余弦值就得把它賦值給一個變量,以便將來使用這個值:

var cx = Math.cos(x);

再次提醒各位,每行代碼就是以分號結束的。

2.復合語句和空語句

可以用逗號運算符將幾個表達式連接在一起,形成一個表達式。同樣,javascript還可以講多條語句聯合在一起,形成一個復合語句(compound statement)。只需花括號將多條語句括起來即可。因此,下面幾行代碼可以當成一條單獨的語句,使用在javascript任何希望使用一條語句的地方。

 

代碼如下:
{
x = Math.PI;
cx = Math.cos(x);
console.log("cos(π)=" + cx);
}

 

關於語句塊有幾點需要注意:第一,語句塊不需要分號。塊中的元素語句必須以分號結尾,但語句塊不需要。

第二,語句塊中的行都有縮進,這不是必須的,但整齊的縮進能使代碼可讀性更強,更容易理解。

第三,javascript沒有塊級作用域,在語句塊中聲明的變量並不是語句塊所私有的。(參考3章10節第一小節)

將很多條語句合並成一個大語句塊的做法在javascript編程中非常常見。類似的表達式通常包含子表達式一樣,很多javascript包含其它子語句,從形式來講,javascript通常允許一個語句塊包含一條子語句。例如:while循環的循環體就可以只包含一條語句。使用語句塊,可以將任意數量的語句放到這個塊中,這個語句塊可以當做一條語句來使用。

在javascript中,當希望多條語句被當做一條語句使用時,使用符合語句來替代。空語句(empty statement)則恰好相反,它允許包含0條語句。空語句如下所示:

;//分號

javascript解釋器在執行空語句時顯然不執行任何動作,但實踐證明:當創建一個具有空循環體的循環時,空語句有時是很有用的,例如下面的for循環

 

代碼如下:
//初始化一個數組a
for (i = 0; i < a.length; a[i++] = 0);

 

在這個循環中,所有的操作都在表達式a[i++]=0中完成,這裡並不需要任何循環體。然而javascript需要循環體中至少包含一條語句,因此這裡只使用了一個單獨的分號來表示一條空語句。

注意,在for循環、while循環或if語句的右邊園括號的分號很不起眼,這很可能造成 一些致命的bug,而這些bug很難定位到。例如下面的代碼的執行結果很可能就是作者不想要的效果:

 

代碼如下:
if((a==0)||(b==0)); //這一行代碼什麼也沒做....
o = null; //這一行代碼總會執行

 

如果有特殊目的使用空語句,最好在代碼中添加注釋,這樣能更清楚的說明這條空語句是有用的

 

代碼如下:
for (i = 0; i < a.length; a[i++] = 0) /*empty*/;

 

3.聲明語句

var和function都是聲明語句,它們聲明或定義變量或函數。這些語句定義標識符(變量名和函數名)並給其賦值,這些標識符可以在程序任意地方使用。聲明語句本身什麼也不做,但它有一個重要意義:通過創建變量和函數,可以更好的組織代碼的語義。

接下幾節將講述var語句和function語句,但並不包含變量和函數的全部內容。

i.var

var語句用來聲明一個或者多個變量,它的語法如下:

var name_1[ = value_1][, ..., name_n[ = value_n]]

關鍵字var之後跟隨的是要聲明的變量列表,列表中的每一個變量都可以帶有初始化表達式,可用於指定它的初始值。例如:

 

代碼如下:
var i; //一個簡單的變量
var j = 0; //一個帶有初始值的變量
var p, q; //兩個變量
var greet = "hello" + name; //更復雜的初始化表達式
var x = 2.34,y = Math.cos(0.75),r, theta; //很多變量
var x = 2,y = x * x; //第二個變量使用了第一個變量
var x = 2,
f = function(x) {return x * x}, //每個變量都獨占一行
y = f(x)

 

如果var語句出現在函數體內,那麼定義的是一個局部變量,其作用域就是這個函數。如果在頂層代碼中使用var語句,那麼它聲明的是全局變量,在整個javascript中,都是可見的。在第三章10節提到:全局變量是全局對象的屬性,然後和其它全局對象屬性不同的是,var聲明的變量是無法通過delete刪除的。

如果var語句中的變量沒有指定初始化表達式,那麼這個變量的值初始為undefined。所以,在聲明語句之前的變量值就是undefined。

需要注意的是,var語句同樣可以作為for循環或者for/in循環的組成部分。(在循環之前聲明的變量聲明一樣,這裡聲明變量也會"提前"),例如:

 

代碼如下:
for (var i = 0; i < 10; i++) console.log(i);
for (var i = 0, j = 10; i < 10; i++, j--) console.log(i * j);
for (var i in o)console.log(i);

 

注意,多次聲明同一變量是無所謂的。

ii.function

關鍵字function用來聲明函數的,我們已經學過函數表達式(4.3).函數定義可以寫成語句的形式。例如:下面示例代碼中的兩種定義寫法:

 

代碼如下:
var f = function f(x) {return x + 1;} //將表達式賦值給一個變量
function f(x){return x + 1;} //含有變量名的語句

 

函數聲明的語法如下:

 

代碼如下:
function funcname([arg1[, arg2[..., argn]]]) {
statements
}

 

funcname是要聲明的函數的名稱標識符。函數名之後是參數列表,參數之間使用逗號隔開。當調用函數的時候,這些標識符則指代傳入函數的實參。

函數體是由javascript語句組成的,語句數量不限,且用花括號括起來。在定義函數時,並不執行函數體內的語句,它和調用函數時待執行的新函數對象相關聯。注意,function函數語句裡的花括號是必須的,這和while循環和其它一些語句鎖使用的語句塊是不同的,即使函數體只有一條語句,仍然需要花括號將其括起來。

 

代碼如下:
function hyteus(x, y) {
return Math.sqrt(x * x + y * y);
}
hyteus(1, 2) //=>2.23606797749979
function facial(n) { //一個遞歸函數
if (n <= 1) return 1;
return n * facial(n - 1);
}
facial(11) //=>39916800

 

函數的聲明通常出現在javascript代碼的最頂部,也可以嵌套在其他函數體內。但在嵌套時,函數聲明只能出現在所嵌套的函數頂部。也就是說:函數定義不能出現在if、while、或其他語句中。

和var語句一樣,函數聲明語句創建的變量也是不可刪除的。但是這些變量不是只讀的,變量值可以重寫。

4.條件語句

條件語句是通過判斷指定的表達式的值是否來執行或跳過某些語句。這些語句是代碼的”決策點“,有時稱為”分支&ldq

copyright © 萬盛學電腦網 all rights reserved