因此,您可能知道,JavaScript 的严格模式对标识符eval
和增加了限制arguments
,有效地使它们成为保留字,但有两个例外:
- 它们仍然可以用作表达式,即在需要表达式的地方(尽管有几个例外),
- 它们仍然可以用作标签名称,并在
break
/continue
语句中引用标签。
现在,我明白了第一个子弹。例如,如果标识符eval
不允许作为表达式(并且真正的保留字不允许),我们将根本无法调用该eval
函数(因为eval(str)
是表达式)。也是如此arguments
——我们需要能够将其用作表达式以便能够访问其元素(例如arguments[0]
)。
不过,这条规则有三个例外。eval
/arguments
可能不会出现 (1) 作为赋值中的左侧表达式 (eg eval = true;
),(2) 作为++
/的操作数--
(eg eval++
), (3) 作为delete
(eg 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
另外,请注意真正的保留字不能用作标签名称。据我了解,严格模式的目的是使 nameseval
和arguments
保留字尽可能相似。那为什么要把它们作为有效的标签名称呢?