js学习笔记3:with语句的使用

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语句少数有用场合之一,就是替换模板变量,不过这个我还没研究明白,等以后有时间再完善。

参考资料:

ECMAScript with 语句

with语句

posted @ 2018-07-11 14:59  朕蹲厕唱忐忑  阅读(207)  评论(0编辑  收藏  举报