时间:2021-07-01 10:21:17 帮助过:2人阅读
with (objectWithLongName1){
propty1=value1;
propty2=value2;
propty3=value3;
method1();
}
这样省去不少敲打键盘的功夫,而且程序的结构也变得更加清晰。但是这样的简写引入了歧义,我们如何知道大括号内的名称,哪些是objectWithLongName1的属性和方法,哪些是外部变量和函数。Javascript的解析规则是,先在objectWithLongName1上查找这些名称的属性,如果没有找到,则认为它们是外部变量。用代码说明就是这样:
代码如下:
if(objectWithLongName1.property1!==undefined){
if(objectWithLongName1.value1!==undefined){
objectWithLongName1.property1=objectWithLongName1.value1; //可能1
}else{
objectWithLongName1.property1=value1;//可能2
}
}else{
if(objectWithLongName1.value1!==undefined){
property1=objectWithLongName1.value1; //可能3
}else{
property1=value1;//可能4
}
}
我们希望的是这四种可能性之一,但是一不小心,程序执行的就会是另外一种可能。而且,这样的写法对于程序的读者来说也非常难解。另一方面,对于Javascript解释器,这种不确定性也影响了语言的性能。
其实只要一个小小的改进,就可以祛除这些缺陷。我们可以在省略了对象的属性前面加上点号,这样就在属性和外部变量之间加上了直观的区分,有不少其他语言就是这样做的。我们最初的例子会变成这样:
代码如下:
with (objectWithLongName1){
.propty1=value1;
.propty2=value2;
.propty3=value3;
.method1();
}
在Javascript做这样的改进之前,两害相权取其轻,要尽量避免使用with语句。我们仍然可以采用一些变通的方法。
代码如下:
var o1= objectWithLongName1;
o1.propty1=value1;
o1.propty2=value2;
o1.propty3=value3;
o1.method1();
或者对于这样的情况:
objectWithLongName1.propty1= objectWithLongName2.propty1;
objectWithLongName1.propty2= objectWithLongName2.propty2;
……
objectWithLongName1.propty10= objectWithLongName2.propty10;
可以写成:
代码如下:
(function(o1, o2, pl){
pl.forEach(function(item){o1[item]=o2[item];});
})( objectWithLongName1,objectWithLongName2, [‘propty1', ‘propty2', … , ‘propty10']);