with 语句
with语句的特点
1.ECMAScript 5 严格模式下 禁用了 with语句
2..函数的上下文this不受with语句影响
3.在with语句的作用域内, 对对象属性引用的优先级绝对高于在更高层级作用域内定义的同名变量。
4.对with作用域内部不存在的属性进行赋值操作,将会导致在全局上下文内进行赋值操作,引入新的全局变量
5.with(obj)如果想在obj上创建新属性,就需要使用对象引用前缀,即使在with作用域内也要这样做
6.with语句的执行会造成很大开销, 而不是局限于与之交互的对象
7.with不是仅仅查找own property,而是也会上溯原型链
应用场景
1.对深层级对象的引用进行缩短
2.简化测试代码 
3.将属性作为全局属性暴露给模板 (with最适合)  (例子 underscore中的template函数)
替代方案:匿名函数自执行
将一个复杂的引用转换成一个简单引用,比完全消除前缀的方式要好
with(abc.efg){}
等价于
(function(s){
     s.xxx
  })(abc.efg)
解决with引入原型属性,消耗性能的方法:使用裸对象
所谓裸对象,即 naked object ,是指没有原型的对象。 
// Object.create(null)可以创建裸对象,再利用追加参数增加属性
// 向一个裸对象追加参数对象的实例属性,减少了因为原型链对with作用域的影响
function returnContext(obj) {
//建立临时对象的原因:防止原型修改时,对裸对象产生影响
var temp = {}
var keys = Object.getOwnPropertyNames(obj)
for (var i = 0; i < keys.length; i++) {
//注意create方法只能接受这种描述符格式的属性
temp[keys[i]] = Object.getOwnPropertyDescriptor(obj, keys[i])
}
return Object.create(null, temp)
}
with(returnContext({a:123})) {
console.log(a)
}
                    
                
                
            
        
浙公网安备 33010602011771号