19

我看到了以with. 这有点令人困惑。它有什么作用以及如何正确使用它?

with (sObj) return options[selectedIndex].value;
4

8 回答 8

22

它增加了块中包含的语句的范围:

return sObj.options[selectedIndex].value;

可以变成:

with (sObj)
    return options[selectedIndex].value;

在您的情况下,它并没有做很多事情......但请考虑以下几点:

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

变成:

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

...节省了几次击键。Mozilla 文档实际上在更详细地解释事物方面做得很好(以及使用它的利弊):

与 - Mozilla 开发者中心

于 2010-03-29T13:56:52.837 回答
10

with语句是纯粹的语法糖,但它也可能导致一些讨厌的错误。

请参阅“被认为有害的声明”以进行澄清:

如果您无法阅读程序并确信您知道它会做什么,那么您就无法确信它会正常工作。出于这个原因,with应该避免这种说法。

于 2010-03-29T13:59:37.593 回答
2

在 with 块中,您不必键入:

sObj.options[selectedIndex].value

但你可以使用:

options[selectedIndex].value
于 2010-03-29T13:57:43.827 回答
2

它相当于

return sObj.options[selectedIndex].value;

With允许您在特定对象的上下文中发出语句块。因此,块中的所有语句with都被视为括号中对象的成员。

这有时可以使代码更具可读性,也可能导致歧义,因为变量引用可以使用 sObj 或全局。

javascript的“with”语句的合法用途:D

于 2010-03-29T13:57:56.730 回答
1

由于性能问题,我建议不要使用它,但上面的意思是:

对于对象sObj(这里大概是一个选择元素),在这个对象上(或在后面的花括号之间)引用的所有子对象和属性都将其视为它们的父范围。

于 2010-03-29T13:57:16.940 回答
1

它不是一个函数(正如在编辑之前的问题标题中所指出的那样),而是一个声明。如果代码示例的格式如下:

with (sObj){
    return options[selectedIndex].value;
}

关于它的作用(来源

with 语句为一组语句建立默认对象。JavaScript 在语句集中查找任何不合格的名称,以确定这些名称是否是默认对象的属性。如果非限定名称与属性匹配,则在语句中使用该属性;否则,使用局部或全局变量。

这意味着在代码示例中,首先检查它是否optionssObj. 如果它是options引用sObj.options,否则它会检查其他范围以查找由名称定义的变量options

使用with语句的缺点是,仅仅看一眼代码就不可能知道访问了什么。如本文所示,还有其他更好的选择

于 2010-03-29T13:57:30.750 回答
1

您的示例可以重写为...

return sObj.options[selectedIndex].value;

...因为 'with' 语句将所有相关语句置于所提供对象的范围内。在这种情况下,这是毫无意义的,但是,如果您在 'sObj' 上进行大量操作,则可以节省大量输入。

完全虚构的例子..

with (sObj) 
{
   if(options[selectedIndex].value < 10){
       options[selectedIndex].value++;
       total+ = options[selectedIndex].value;
   }
}

但是,话虽如此,通常情况下可以通过更好的方式来节省打字。

于 2010-03-29T14:00:03.413 回答
0

它给你和其他人带来痛苦和苦难

于 2010-03-29T14:20:42.240 回答