雖然文章標題是『語句與表達式』,在這篇文章中,我將陳述一個觀點 每一個表達式都有一個值。 在此以外,也會繼續表述這個『代碼之謎』系列的主題——數學與計算機之間被常常忽略的矛盾。 javascript
簡單的講 html
使用表達式也是函數式編程語言所提倡的,而傳統命令式編程語言都是語句的堆砌。 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(函數式編程)的一些核心思想了。