可以和()一起使用吗?

时间:2012-03-25 21:01:37

标签: javascript

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

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

3 个答案:

答案 0 :(得分:4)

您关联的MDN说Using with is not recommended ...
with是制作午餐意大利面条代码的绝佳方式。

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

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

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

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


When is the comma operator useful?
The comma swap Fiddle

答案 1 :(得分:3)

只要您理解,就可以使用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对象的属性已经存在。

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

答案 2 :(得分:2)

道格拉斯·克罗克福德在他的优秀着作“Javascript:The Good Parts”中列出了附录B:不良部分中的“with Statement”。

他说“不幸的是,其结果有时可能无法预测,因此应该避免”。

他继续给出一个例子,其中with内部的赋值将根据对象是否被定义而对不同的变量进行操作。

参见With statement considered harmful(但不如书中的解释详细)。