以下代码:
console.log((var a=5; ++a));
不编译,因为var
被认为是语句,而不是函数。以下确实编译:
console.log((a=5, ++a));
和预期的一样,输出 6 - 但它会污染外部命名空间。有没有办法让第一个片段工作,而不引入闭包,如下所示?
console.log((function(a){return ++a})(5))
这是针对以 JavaScript 为目标的编译器,因此您的答案必须尊重要求。
以下代码:
console.log((var a=5; ++a));
不编译,因为var
被认为是语句,而不是函数。以下确实编译:
console.log((a=5, ++a));
和预期的一样,输出 6 - 但它会污染外部命名空间。有没有办法让第一个片段工作,而不引入闭包,如下所示?
console.log((function(a){return ++a})(5))
这是针对以 JavaScript 为目标的编译器,因此您的答案必须尊重要求。
不,至少从 ECMAScript 语言规范的 5.1 版开始,当前的现代浏览器 JS 是基于那里的。
当你这样做时console.log(
- 接下来是一个ArgumentList
.
它本身包含一个AssignmentExpression
.
赋值表达式是:
条件表达式:
LeftHandSideExpressionAssignmentOperatorAssignmentExpression
条件表达式是 LogicalORExpression 或三元表达式,为了完整起见,我们鼓励您进一步研究这部分,但它们并没有真正帮助我们(它描述了诸如a || 3
example 之类的事物是如何定义的,以及诸如 之类的事物的括号a && 6
)。
现在,另一个分支是ConditionalExpressionNoIn
三元运算符。(即 ?: 的简写 if)。此外,一个简短的调查可以告诉我们只运行表达式。
另一方面,左侧表达式允许函数表达式,但没有其他对打开语句真正有帮助的东西。
现在,另一方面,avar
出现在两个地方。在 aVariableStatement
或 in 迭代构造中,例如 for 显式。这两个又不能出现在AssignmentExpression中。
因此,就像前面的答案所暗示的那样。遵守规范的 JavaScript 实现不允许您要求的那种语法。此列表中唯一允许在其中使用语句的表达式确实是函数表达式。
不,如果不引入函数,您将无法做到这一点。只需在语句上方声明您的变量。