引子:表达式和语句很基础,可是有时会犯错,好比:git
function(){}//报错 (function(){})//不报错 function f(x){ return x + 1 }()//报错 function f(x){ return x + 1 }(1)//不报错,为何返回 1
能明白为何?github
解释:express
第一行代码:由于JavaScript 将 function 关键字看成一个 函数声明语句 的开始,而函数声明语句 function 关键字后面应该是 函数名,这里后面跟圆括号,固然会报错。数组
第二行代码:给它加上一对圆括号,解析器会把()里的当作表达式去解析,在这里就会当作匿名函数表达式解析,因此不会报错。函数
第三行代码:在一条语句后面加上()会被当作分组操做符,分组操做符里必需要有表达式,因此这里报错;spa
第四行代码:在一条函数声明语句后面加上(1),仅仅是至关于在声明语句以后又跟了一条毫无关系的表达式,等价于下面代码:设计
function f(x){ return x + 1 } (1)//1
因此返回了可有可无的答案;code
看来基础仍是要看看的,下面甩定义:对象
表达式(expression):blog
js 中的一个短语,js 解释器会将其计算出一个结果。程序中的常量是最简单的一类表达式。
变量名也是一种简单的表达式,它的值就是赋值给变量的值。
复杂表达式是由简单表达式组成的。好比,数据访问表达式是由一个表示数组的表达式、左方括号、一个整数表达式和右方括号构成。它们所组成的新的表达式的运算结果是该数组的特定位置的元素值。
一样的,函数调用表达式由一个表示函数对象的表达式和0个或多个参数表达式构成。
将简单表达式组合成复杂表达式最经常使用的方法就是使用运算符(opetator)。
运算符按照特定的运算规则对操做数(一般是两个)进行运算,并计算出新值。
乘法运算符“*”是比较简单的例子。表达式x*y是对两个变量表达式x和y进行运算并得出结果。有时咱们更愿意说运算符返回了一个值而不是“计算”出了一个值。
书上目录截图:
语句(statement):
js 整句或命令。js 语句是以分号结束;表达式计算出一个值,但语句用来自行以使某件事发生。
“使某件事发生”的一个方法是计算带有反作用的表达式。诸如赋值和函数调用这些有反作用的表达式,是能够做为单独的语句的,这种把表达式当作语句的用法也称做表达式语句(expression statement)。相似的语句还有声明语句(declaration statement),声明语句用来声明新变量或定义新函数。
书上目录截图:
参考资料: