【发布时间】:2012-09-24 00:49:36
【问题描述】:
因此,您可能知道,JavaScript 的严格模式增加了对标识符 eval 和 arguments 的限制,有效地使它们成为保留字,但有两个例外:
- 它们仍然可以用作表达式,即在需要表达式的地方(但有几个例外),
- 它们仍然可以用作标签名称,并在
break/continue语句中引用标签。
现在,我理解了第一个项目符号。例如,如果标识符 eval 不允许作为表达式(并且真正的保留字不允许),我们将根本无法调用 eval 函数(因为 eval(str) 是一个表达式)。 arguments 也是如此 - 我们需要能够将其用作表达式才能访问其元素(例如 arguments[0])。
不过,这条规则有三个例外。 eval/arguments 不能出现 (1) 作为赋值的左侧表达式(例如 eval = true;),(2)作为 ++/-- 的操作数(例如 eval++),(3 ) 作为delete 的操作数(例如delete eval)。这些是唯一的例外,在所有其他表达式上下文中,它们都是有效的。
我不明白的是第二个子弹。为什么它们仍然可以用作标签名称?例如,此代码即使在严格模式下也有效:
eval: for ( var i = 0; i < 10; i++ ) {
arguments: for ( var j = 0; j < 10; j++ ) {
if ( i < j ) continue eval;
console.log( i - j );
}
}
注意continue eval; 如何引用eval 标签,与实际的eval 函数无关。
另外,请注意真正的保留字不能用作标签名称。据我了解,严格模式的目的是使名称eval 和arguments 尽可能类似于保留字。那为什么要把它们作为有效的标签名称呢?
【问题讨论】:
-
您应该通过es5-discuss 讨论列表询问参与编写 ES5 的人员。你可能只会在这里得到猜想——有一些可以开始的。 :-)
-
@alex 关于你的 Twitter 回复,如你所见,Stack Overflow 没有让你失望
:)
标签: javascript theory