如何在严格模式下使用“with”语句特性?

3
当将Javascript设置为严格模式时,不再允许使用"with"语句。我该如何复制它的作用?
例如,如何使其在搜索变量之前搜索数组...
        var a = {x:1, y:2};
        var x = 3;
        with (a) {
            console.log(x);
        }

控制台将显示1。但在严格模式下,必须删除“with”。如果控制台语句在其外部,则将显示3。

3
不要这样做。他们在严格模式下关闭它是有原因的。或者,禁用严格模式。 - user229044
2
如何用一把上了锁的枪朝自己的脚开火?你做不到。而这正是关键所在! - Joseph Silber
2
只要你理解它,with 没有任何问题。就像我们掌握的其他工具一样。让我们不再恐慌。 - cookie monster
2
@cookiemonster - 这会造成歧义。例如,在with中的console.log应该会因为没有a.console而导致错误,但实际上它却能正常工作。 - Derek 朕會功夫
...在您的示例中,location并没有提供任何意外的结果。或者至少不会比在任何其他嵌套作用域中更加意外。这里有一个没有使用with的类似示例。http://jsfiddle.net/34kfz/2/ 对于location也是相同的结果。 - cookie monster
显示剩余9条评论
2个回答

1

你不能

MDN with docs中得知

使用with不被推荐,在ECMAScript 5严格模式下是禁止的。推荐的替代方法是将你想要访问属性的对象分配给一个临时变量。


-1

严格模式重新定义了Javascript的某些部分,旨在消除一些不明确和不兼容的问题。你不能使用严格模式然后期望受影响的语言元素仍然可用。

使用with会导致变量作用域的不明确性 - 在你的例子中已经显而易见 - 并且与ES6及更高版本中提出的标准不兼容。你可以在MDN网站上找到更详细的讨论here

在你的具体示例中,你总是可以console.log(a.x);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接