js语法中with的学习

来源:互联网 发布:淘宝网孕妇秋装套装 编辑:程序博客网 时间:2024/06/06 00:49

首先呢,严格模式下with报错,而且with在js引擎环境下运行缓慢,所以并不建议使用。当然了,通过各种资料,with貌似都是用来拓展作用域,延长作用域链,简化书写,具体的就不深入了。

with 语句用于设置代码在特定对象中的作用域。

它的语法:with (expression) statement

毕竟,with运行缓慢!知道有这么个东西就好。

举个例子

var  obj={a:"11",b:"22"}with(obj){   console.log(a,b)}

with能够扩充obj对象的作用域,我们可以直接书写obj中对象a,b;如果不是因为运行缓慢这一个巨大缺欠,到也方便。换成我们普通写法,那就得obj.a ,obj.b  有点麻烦。既然是扩展作用域,那么我们也可以干点别的。

var  obj ={    a:40,    fn:function(){        with(this){        var a=100;        console.log(a);       }   }}obj.fn();console.log(obj.a);
简单说明下,对象中有函数,with中的this代表是obj对象,所以with扩展了obj作用域,那么fn中的变量a就会由原来的fn内部提升变为obj对象提升,所以第一个打印a结果是100,而外部打印的obj.a结果也明显了,由于with影响,fn内部a=100修改了obj.a的值,所以也是100

由于这部分功能,某些js插件库依旧使用with简化书写,但是大家也看出来,with弊端明显,不仅慢,而且很多时候不利于代码维护和阅读。就好比上面作用域扩充,直接就导致变量a被覆盖。如果是大量代码,维护起来难,阅读代码都费劲。

由于阅读难,那么个人使用with也容易造成潜在bug,因为代码作用域扩充,稍不注意,跳开函数作用域,各种全局变量,就很头疼。

最后,对于js引擎解析with时候,查找相关属性先后顺序,不深入了,具体的大家可以看下参考链接以及百度谷歌。


参考链接:http://www.jb51.net/article/79474.htm