with语句
with是ECMAScript规定的内容,主要用于设置代码在特定对象中的作用域。
var sMessage = "hello";with(sMessage) { console.log(toUpperCase()); //输出 "HELLO"} //等同于 alert(sMessage.toUpperCase())
with
语句可以在不造成性能损失的情況下,减少变量的长度
with(Math){ length=PI*r*2 x=r*cos(deg) y=r*sin(deg) area=PI*r*r }
上面代码指定Math作为默认对象,先在对象内寻找PI、cos、sin函数与属性,无需Math.PI、Math.cos()、Math.sin()这样写,可以减少不必要的指针路径解析运算,但是可以用临时变量来达到同样的效果。
with(o1.o2.o3) { console.log(p1 + p2); } // 可以写成 var temp = o1.o2.o3; console.log(temp.p1 + temp.p2);
看了几篇博客和资料,都不太推荐with语句的使用。
1、先在指定的对象再去其他对象查找变量会很慢。
第一个例子里面,当操作变量r与deg时,首先在Math对象里面找不到,之后会再去其他的对象里面寻找。在对性能要求比较高的场合,with里面的语句块,应该只包含指定对象的属性和方法,但是这一点很明显是不太可能滴。
2、容易语义不明,绑定对象不明确,拖慢运行速度。
function f(x, o) { with (o) print(x);}
上面几行代码,如果对象o里面定义了属性x,那么输出的就是o.x,如果没有的话也不会报错,会返回上一级作用域,输出x的值。
万一需要取得是o.x,而某个粗心的队友恰好没有初始化o.x,那就等着完犊子吧,很难出原因来,因为编译器根本就不会报错,这样使用with不利于代码的除错和模块化,编译器也无法对这段代码进行优化,只能留到运行时判断,这就拖慢了运行速度。
3、在 ECMAScript 5 中该标签已被禁止。推荐的替代方案是声明一个临时变量来承载你所需要的属性。
with
语句少数有用场合之一,就是替换模板变量,不过这个我还没研究明白,等以后有时间再完善。
参考资料: