with经常被嫌弃,好像存在就是错误,今天我们来总结一下with()-个人理解,有错误还请指出
with 语句的原本用意是为逐级的对象访问提供命名空间式的速写方式. 也就是在指定的代码区域, 直接通过节点名称调用对象。
以下是案例
一.书写方式
1.正常写法
2.变量替换的写法
3.with写法
二.javascript各类书籍对with()的负面描述
三.为什么不推荐使用with()
1.性能
简单对一个对象属性赋值100万次,是否使with的结果差距还是很明显:
2.不可预测性
with语句产生的不可预测性是废弃with的原因。with强行割裂了词法作用域,将对象临时性地插入到了作用域链中。这使得出现了难以捉摸的代码。
字符串"sword"和空对象没有问题,但当传入的参数是带有同名a属性的a对象时,with强行访问了a.a
另外,在with语句中声明的变量,并不属于with指定的参数对象:
在with中声明的变量实际上是被添加到外层的function上的:
以上两种情况是因为with代码触发了RHS查询机制导致的
RHS简述
在引擎执行的第一步操作中,对变量a进行了查询,这种查询叫做LHS查询。实际上,引擎查询共分为两种:LHS查询和RHS查询
从字面意思去理解,当变量出现在赋值操作的左侧时进行LHS查询,出现在右侧时进行RHS查询
更准确地讲,RHS查询与简单地查找某个变量的值没什么区别,而LHS查询则是试图找到变量的容器本身,从而可以对其赋值
foo( 2 );
这段代码中,总共包括4个查询,分别是:
1、foo(...)对foo进行了RHS引用
2、函数传参a = 2对a进行了LHS引用
3、console.log(...)对console对象进行了RHS引用,并检查其是否有一个log的方法
4、console.log(a)对a进行了RHS引用,并把得到的值传给了console.log(...)
四.代码优化问题
代码无法优化
由于无法进行预测,代码含义一直在发生变化,不同的调用,或者即使相同的调用也会因为运行时的变化而出现偏差,从而使得代码无法被优化。
优化指两方面,一方面解析和运行变得缓慢,指的就是之前已经谈到的性能。另一方面对于代码优化和压缩工具来说,无法确定是变量还是属性,就不能进行重命名(因为属性无法被重命名)。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。