Mozilla表达式也是陈述.为什么?

van*_*353 2 javascript

从Mozilla的JavaScript指南中查看这些文章:

表达式

声明

表达式也被视为赋值语句.事实上,在第二篇文章中,人们可以读到"任何表达也是一种陈述".熟悉其他编程语言,我认为表达式总是值,但它们永远不会像语句那样引起副作用.换句话说,7,7 + 8,"字符串"等是表达式,因为它们不会改变状态,但是a = 7是一个语句,因为现在已经定义了一个变量(即状态已经改变) ).

为什么Mozilla不能在JS中区分这两者?

Dan*_*ski 5

我相信你的字面意思是"表达"和"陈述"."表达式不改变任何状态"对编程语言来说是一个非常严格的要求.

一个思想实验:用函数调用7 + 8代替8

var globalVar = 0;
function my8() { 
  globalVar = globalVar + 1; 
  return 8;
} 
Run Code Online (Sandbox Code Playgroud)

7 + my8()陈述还是表达?这里没有明显的状态变化,但仍会my8进行状态变化.使用"无副作用"定义,如果7 + my8()不分析my8函数代码,就无法确定是否是语句或表达式.当然,可以简单地禁止任何状态更改作为函数调用的一部分,但这不是JavaScript的方式.

根据我的经验,大多数语言将"返回值的所有内容"定义为表达式和语句,将其他所有内容定义为语句.

回答你的问题"为什么Mozilla不能区分JS中的两个?":

我认为他们这样做,但不是以你期望的方式.要考虑"返回值的所有东西",表达式似乎是最实用的方法.

同样,作为语句的代码块和表达式之间也没有矛盾.这就是Javascript和许多其他语言的工作原理.当然,总是可以在这两者之间划出更严格的界限.

例子:

赋值返回值,因此这是可能的:

 a = b = c = 1;
Run Code Online (Sandbox Code Playgroud)

它可以用更明显的形式编写:

 a = (b = (c = 1));
Run Code Online (Sandbox Code Playgroud)

因此,赋值被认为是表达式(也是语句).

另一方面:

if (true) { };
Run Code Online (Sandbox Code Playgroud)

不返回值(在Javascript!中),因此不是表达式(但仍然是一个语句).