可以和(一起使用吗

Is it okay to use with()?

本文关键字:一起      更新时间:2023-09-26

有一次,我看到了这样一个例子:

var a, x, y;
var r = 10;
with (Math) {
  a = PI * r * r;
  x = r * cos(PI);
  y = r * sin(PI / 2);
}

它看起来非常方便,因为这样我就不必键入所有的Math. s。

但当我看MDN时,它说:

不建议使用with,并且在ECMAScript 5的严格模式中禁止使用。建议的替代方法是将要访问其属性的对象分配给临时变量。

那么可以使用with()吗?在HTML5中?

您链接的MDN显示Using with is not recommended
with是制作午餐意大利面条代码的一种很好的方法。

你可能喜欢它,但需要调试它的人会诅咒你。

javascript有一些非常奇怪的运算符,比如逗号运算符(,
你能理解以下代码的作用吗?

var a = "a";
var b = "b";
a = [b][b = a,0];

它交换了a和b…你不理解,,所以需要维护你的with代码。不要使用黑客,黑客在猜谜游戏中很酷,而不是在真正的代码中。


逗号运算符什么时候有用
逗号交换Fiddle

只要您理解,就可以使用JavaScript的任何功能。

例如,使用with,您可以访问对象的现有属性,但不能创建新属性。

观察:

var obj = {a:1,b:2};
with(obj) {
    a = 3;
    c = 5;
}
// obj is now {a:3,b:2}, and there is a global variable c with the value 5

它可以用于缩短代码,例如:

with(elem.parentNode.children[elem.parentNode.children.length-3].lastChild.style) {
    backgroundColor = "red";
    color = "white";
    fontWeight = "bold";
}

因为style对象的属性已经存在。

我希望这个解释足够清楚。

Douglas Crockford在他的优秀著作《Javascript:好的部分》中,在附录B:坏的部分中列出了"with Statement"。

他说:"不幸的是,它的结果有时是不可预测的,所以应该避免"。

他接着举了一个例子,根据对象是否定义,with中的赋值将对不同的变量进行操作。

请参阅被认为有害的陈述(但不如书中的解释详细)。