代碼之謎(二)- 語句與表達式

雖然文章標題是『語句與表達式』,在這篇文章中,我將陳述一個觀點 每一個表達式都有一個值。 在此以外,也會繼續表述這個『代碼之謎』系列的主題——數學與計算機之間被常常忽略的矛盾。 javascript

簡單的講 html

  • 「表達式」(expression)是一個單純的運算過程,老是有返回值;
  • 「語句」(statement)是執行某種操做,沒有返回值。

使用表達式也是函數式編程語言所提倡的,而傳統命令式編程語言都是語句的堆砌。 java

表達式和語句如何區分呢? 最簡單最直觀的鑑別方法就是, 後面有分號的是語句, 這是一個充分條件而不是必要條件。 有分號,就是語句;沒有分號,就不必定了,也多是語句,也多是表達式。 express

在動態語言——好比javascript——中是經過上下文來區分這二者的。 編程

假如若是 function foo(){} 在一個賦值表達式的一部分,則認爲它是一個表達式。 表達式的一部分,也是表達式。 而若是 function foo(){} 被包含在一個函數體內,或者位於程序中,則將它做爲一個語句。 json

function foo(){}; // 聲明,由於它是程序的一部分
var bar = function foo(){}; // 表達式,由於它是賦值表達式的一部分

new function bar(){}; // 表達式,由於它是New表達式的一部分

(function(){
	function bar(){}; // 聲明,由於它是函數體的一部分
})();

還有一種不那麼顯而易見的表達式,就是被包含在一對圓括號中—— (function foo(){})。 將這種形式當作表達式一樣是由於上下文的關係: (和)構成一個分組操做符,而 分組操做符只能包含表達式編程語言

(function foo(){}); // 函數表達式:注意它被包含在分組操做符中
(var x = 5);  // error! 分組操做符只能包含表達式,不能包含語句(這裏的var就是語句)

今天忽然有人問我: 函數式編程

alert(eval(data));

爲何會報錯呢?data 是一個對象,按理說應該會彈出 ObjectObject 啊。 這是由於,當咱們寫 函數

{"username" : "justjavac"}

時,它並非一個對象。 由於咱們知道有一種表示數據的方法叫作 json(javascript對象表示法), 因此想固然的認爲這應該是一個對象。 其實,在大部分編程語言中,大括號({})表示的不是對象,而是代碼塊,這段代碼其實等價於 code

{
	"username" : "justjavac"
}

很顯然,"username" : "justjavac" 並非合法的語句。 然而解決方法也很簡單,就是添加括號——分組操做符

({"username" : "justjavac"})

這樣就構成了一個合法的表達式,當咱們進行 json 對象解析的時候能夠寫以下代碼:

eval('(' + json + ')')

在表達式中,只能存在表達式,不能存在語句。

例如表達式

(var a = 4) + 4;

這段代碼將產生一個錯誤,由於 var a = 4 是一個語句, 而不是表達式—— 對錶達式求值必須返回值,但對語句求值則未必有返回值

相似的

if (var a = 0) {}

也產生錯誤,由於 var a = 0' 是一條語句,而 **語句沒有返回值**。if 語句的語法結構爲

if (expression) {
    statement;
    statement;
    ……
}

所以

if (var a = 0) {}

是錯誤的,可是

if (true) {
    var a = 0;
}

則是正確的。

最後重申一下,每一個表達式都有一個值。 理解了這個,就能夠很容易的理解 FP(函數式編程)的一些核心思想了。

相關文章
相關標籤/搜索