虽然文章标题是『语句与表达式』,在这篇文章中,我将陈述一个观点 每一个表达式都有一个值。 在此以外,也会继续表述这个『代码之谜』系列的主题——数学与计算机之间被常常忽略的矛盾。 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(函数式编程)的一些核心思想了。