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

时间:2013-08-20 07:47:37

标签: javascript

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

Expressions

Statements

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

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

3 个答案:

答案 0 :(得分:5)

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

思考实验:在7 + 8替换8并调用函数

var globalVar = 0;
function my8() { 
  globalVar = globalVar + 1; 
  return 8;
} 

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

根据我的经验,大多数语言将“返回值的所有内容”定义为表达式和语句,其他所有内容都只是声明。

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

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

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

<强>示例:

作业返回值,所以这是可能的:

 a = b = c = 1;

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

 a = (b = (c = 1));

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

另一方面:

if (true) { };

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

答案 1 :(得分:1)

表达式是一个代码片段,它返回一些值Expression (Computer Science)

3; // 3
{}; // Object
func(); // whatever func returns, or undefined if not specified

您可以将表达式组合成一个复合表达式:

3 + 7; // 10
{}, []; // Array. Comma operator always returns result of right-most expression

语句是可以编译或解释的最小有效代码片段Statement (Computer Science)

5; // valid js

您还可以将语句组合成复合语句:

check || func(); // valid js
{
    4 + 9;
    "block statement";
}

在Mozilla文档中,语句引用由分号(;)显式或隐式终止的任何(复合)语句。

[,,[],[,[,,],,]]; // Array declaration whose reference is returned (and ignored)
// Multi-dimensional array with empty (undefined) elements

在某些编程语言中,上面的示例不编译或不解释。其他语言可能不允许表达式的结果不被捕获。

Javascript非常富有表现力,这就是每个表达式都算作有效声明的原因。有些陈述不是表达式,如break,return,while等。他们不返回任何值,但他们控制程序执行流程

答案 2 :(得分:0)

Mozilla确实区分了两者,或者更确切地说是Javascript语法。

关于Javascript的唯一一点点“特殊”如下:

“任何表达式也是声明”

这意味着在语法中需要语句的地方,可以直接使用表达式(但不能相反)。例如。以下是有效的Javascript,但在许多其他类似语言中无效:

if (true) "asfd"

foo = function(){
  if (5) { 
    "some text here that won't do anything";
    return true;
    42; // always good to have that one here!
  }
}

而语句不能用作表达式:

a = (if (true) 5)   // does not work "unexpected token 'if'"

如果您将表达式 "use strict"添加为第一个语句,他们将严格模式规范使用该“功能”而不引入新的关键字或语法在函数体中,Javascript在严格模式下执行以支持浏览器。

虽然表达式求值为一般值,但语句却没有。大多数语句都会改变控制流,表达式通常不会(尽管有人可能会认为导致异常被抛出的表达式也会改变控制流)。 在Javascript表达式中形成所有语句的子集。