如下代码:
console.log((var a=5; ++a));
不编译,因为var
被认为是语句,而不是函数。确实会编译以下内容:
console.log((a=5, ++a));
和预期的单词一样,输出6-但它会污染外部名称空间。有什么办法可以在不引入闭包的情况下使第一个代码段起作用,如下所示?
console.log((function(a){return ++a})(5))
这是针对JavaScript的编译器的,因此您的回答必须尊重这些要求。
否,至少从当前现代浏览器JS所基于的ECMAScript语言规范的5.1版开始。
当您这样做时console.log(
-接下来是ArgumentList
。
本身包含一个AssignmentExpression
。
分配表达式为:
条件表达式:
LeftHandSideExpression AssignmentOperator AssignmentExpression
条件表达式是LogicalORExpression或三元表达式,为完整起见,建议您进一步研究此部分,但它们并不能真正帮助我们(它描述了诸如此类a || 3
的定义,以及对诸如此类的贬义a && 6
)。
现在,另一个分支是ConditionalExpressionNoIn
三元运算符。(即?:,如果是简写)。简短的调查也可以证明我们仅运行表达式。
另一方面,左侧表达式允许使用函数表达式,但是没有其他真正对打开语句有用的方法。
现在,另一方面,avar
出现在两个位置。在中VariableStatement
,或在迭代中明确地构造for。这些都不能再出现在AssignmentExpression中。
因此,就像前面的答案所暗示的那样。遵守规范的JavaScript实现不允许您要求的语法。在仅表达在此列表中,让里面的语句确实是函数表达式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句