我看到了一些以 with
开头的 JavaScript 代码。这有点令人困惑。它是做什么的,如何正确使用?
with (sObj) return options[selectedIndex].value;
我看到了一些以 with
开头的 JavaScript 代码。这有点令人困惑。它是做什么的,如何正确使用?
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 (sObj){
return options[selectedIndex].value;
}
关于它的作用(源代码)
with
语句为一组语句建立默认对象。JavaScript在一组语句中查找任何未限定的名称,以确定这些名称是否是默认对象的属性。如果未限定的名称与属性匹配,则该属性用于语句;否则,使用本地或全局变量。
这意味着在代码示例中,首先检查options
是否是sObj
的属性。如果是,则options
指的是sObj.options
,否则它会检查其他范围内是否有以options
命名的变量。
使用with
语句的缺点是仅凭一眼扫过代码就无法知道访问了哪些内容。如本文所示,还有其他更好的替代方案。
with
语句有任何关系。我说如果使用大括号进行格式化,它会更有意义,因为这使它看起来不像函数调用,而更像一个语句。 - Yacoby你的例子可以重写为...
return sObj.options[selectedIndex].value;
...由于'with'语句将所有相关语句放置在提供的对象范围内,因此可以省略一些代码。在这种情况下,这是相当无意义的,但是如果您要对'sObj'执行大量操作,则可以节省很多打字。
完全虚构的例子...
with (sObj)
{
if(options[selectedIndex].value < 10){
options[selectedIndex].value++;
total+ = options[selectedIndex].value;
}
}
不过话说回来,通常可以更好地实现节省输入。