首先呢,严格模式下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