我看到了以with
. 这有点令人困惑。它有什么作用以及如何正确使用它?
with (sObj) return options[selectedIndex].value;
我看到了以with
. 这有点令人困惑。它有什么作用以及如何正确使用它?
with (sObj) return options[selectedIndex].value;
它增加了块中包含的语句的范围:
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 文档实际上在更详细地解释事物方面做得很好(以及使用它的利弊):
该with
语句是纯粹的语法糖,但它也可能导致一些讨厌的错误。
请参阅“被认为有害的声明”以进行澄清:
如果您无法阅读程序并确信您知道它会做什么,那么您就无法确信它会正常工作。出于这个原因,
with
应该避免这种说法。
在 with 块中,您不必键入:
sObj.options[selectedIndex].value
但你可以使用:
options[selectedIndex].value
它相当于
return sObj.options[selectedIndex].value;
With
允许您在特定对象的上下文中发出语句块。因此,块中的所有语句with
都被视为括号中对象的成员。
这有时可以使代码更具可读性,但也可能导致歧义,因为变量引用可以使用 sObj 或全局。
由于性能问题,我建议不要使用它,但上面的意思是:
对于对象sObj(这里大概是一个选择元素),在这个对象上(或在后面的花括号之间)引用的所有子对象和属性都将其视为它们的父范围。
它不是一个函数(正如在编辑之前的问题标题中所指出的那样),而是一个声明。如果代码示例的格式如下:
with (sObj){
return options[selectedIndex].value;
}
关于它的作用(来源)
with 语句为一组语句建立默认对象。JavaScript 在语句集中查找任何不合格的名称,以确定这些名称是否是默认对象的属性。如果非限定名称与属性匹配,则在语句中使用该属性;否则,使用局部或全局变量。
这意味着在代码示例中,首先检查它是否options
是sObj
. 如果它是options
引用sObj.options
,否则它会检查其他范围以查找由名称定义的变量options
使用with
语句的缺点是,仅仅看一眼代码就不可能知道访问了什么。如本文所示,还有其他更好的选择
您的示例可以重写为...
return sObj.options[selectedIndex].value;
...因为 'with' 语句将所有相关语句置于所提供对象的范围内。在这种情况下,这是毫无意义的,但是,如果您在 'sObj' 上进行大量操作,则可以节省大量输入。
完全虚构的例子..
with (sObj)
{
if(options[selectedIndex].value < 10){
options[selectedIndex].value++;
total+ = options[selectedIndex].value;
}
}
但是,话虽如此,通常情况下可以通过更好的方式来节省打字。