js 表达式和语句的区别

语句可以理解成一个行为.循环语句、赋值语句(?)和控制语句就是典型的语句.一个程序是由一系列语句组成的
表达式会有一个值
JavaScript中某些需要语句的地方,你可以使用一个表达式来代替.这样的语句称之为表达式语句.但反过来不可以:你不能在一个需要表达式的地方放一个语句.比如,一个if语句不能作为一个函数的参数
逗号运算符会计算前后两个表达式,然后返回右边表达式的计算结果.

使用函数声明定义函数时,函数表达式的名字只能在函数内部使用me
但是使用函数表达式定义函数时会静默赋值给相同名字的变量,在外部也就可以使用me了
> var fac = function me(x) { return x <= 1 ? 1 : x * me(x-1) }
> fac(10)
3628800
> console.log(me)
ReferenceError: me is not defined

有些相同的代码,出现在表达式上下文和出现在语句上下文会表现出不同的作用
有些表达式表达式语句语句上下文中有重叠,所以js禁止表达式语句以大括号或关键字"function"开头(即遇到大括号和function表达式语句执行,而不是计算表达式当作语句)。
{a:1} //正常,但不是对象,而是以语句执行。
function () { return "abc" }()// 报错。以语句执行,需要一个函数名(跟定义一样静默做了赋值动作)。加了也不能解释后面的括号。
(function () { return "abc" }())//小括号内表示一个表达式,不加小括号表示一个[表达式]语句,function开头被js禁止。

使用空圆括号时前面必须是函数.

> {x: 1} //1,js解释为语句
> o : {c:1} //1,js解释为嵌套语句块,o,c都为语句块标识(用来跳转),并未做任何赋值
> c = {1} //报错,在需要表达式式的地方不能放语句

console输入语句显示的值(eval执行结果)是:最后计算的表达式的值。
// chrome console中 {a : 1} 会自动加 () 按表达式执行

do 表达式将块级语句转为表达式, 如 n = do {2;}  => n==2; // es7