JSLint(自2013年七月)在遇到使用with语句时,会抛出"Unexpected 'with'"的错误。而在2013年七月之前,这个消息是"Expected an identifier and instead saw 'with'", 尽管原因是一样的。以下是一个例子:
with语句被设计用来访问深度嵌套的对象属性。在上面这个例子中,我们不需要在with语句中写a.b这样的代码,因为语句体的执行在变量词法环境中,使得b的引用指向了a的一个属性。
在上述例子中,我们尝试着在with语句中对a的两个属性赋值。但是a没有标示符为c这个属性。所以我们实际上是访问到了父作用域的变量c并错误的改变了它的值,而不是新创造了一个属性。
这是with不被鼓励使用的主要原因。事实上,如果你的代码在严格模式下运行,任何对with的使用都会造成语法错误(可以参考相关的JSHint"'with' is not allowed in strict mode"的消息以获得更多内容)。以下是更好的方法来实现相同的事: