2

以下代码:

console.log((var a=5; ++a));

不编译,因为var被认为是语句,而不是函数。以下确实编译:

console.log((a=5, ++a));

和预期的一样,输出 6 - 但它会污染外部命名空间。有没有办法让第一个片段工作,而不引入闭包,如下所示?

console.log((function(a){return ++a})(5))

这是针对以 JavaScript 为目标的编译器,因此您的答案必须尊重要求。

4

2 回答 2

4

,至少从 ECMAScript 语言规范的 5.1 版开始,当前的现代浏览器 JS 是基于那里的。

当你这样做时console.log(- 接下来是一个ArgumentList.

它本身包含一个AssignmentExpression.

赋值表达式是:

条件表达式:

LeftHandSideExpressionAssignmentOperatorAssignmentExpression

条件表达式是 LogicalORExpression 或三元表达式,为了完整起见,我们鼓励您进一步研究这部分,但它们并没有真正帮助我们(它描述了诸如a || 3example 之类的事物是如何定义的,以及诸如 之类的事物的括号a && 6)。

现在,另一个分支是ConditionalExpressionNoIn三元运算符。(即 ?: 的简写 if)。此外,一个简短的调查可以告诉我们只运行表达式。

另一方面,左侧表达式允许函数表达式,但没有其他对打开语句真正有帮助的东西。

现在,另一方面,avar出现在两个地方。在 aVariableStatement或 in 迭代构造中,例如 for 显式。这两个又不能出现在AssignmentExpression中。

因此,就像前面的答案所暗示的那样。遵守规范的 JavaScript 实现不允许您要求的那种语法。此列表中唯一允许在其中使用语句的表达式确实是函数表达式。

于 2013-09-18T07:42:06.663 回答
2

不,如果不引入函数,您将无法做到这一点。只需在语句上方声明您的变量。

于 2013-09-18T07:23:35.123 回答