image.png
with经常被嫌弃,好像存在就是错误,今天我们来总结一下with()-个人理解,有错误还请指出
with 语句的原本用意是为逐级的对象访问提供命名空间式的速写方式. 也就是在指定的代码区域, 直接通过节点名称调用对象。
以下是案例

一.书写方式

1.正常写法

image.png

2.变量替换的写法

image.png

3.with写法

image.png

二.javascript各类书籍对with()的负面描述

image.png

三.为什么不推荐使用with()

1.性能

image.png
简单对一个对象属性赋值100万次,是否使with的结果差距还是很明显:
image.png
image.png

2.不可预测性

with语句产生的不可预测性是废弃with的原因。with强行割裂了词法作用域,将对象临时性地插入到了作用域链中。这使得出现了难以捉摸的代码。
image.png
字符串"sword"和空对象没有问题,但当传入的参数是带有同名a属性的a对象时,with强行访问了a.a

另外,在with语句中声明的变量,并不属于with指定的参数对象:
image.png

在with中声明的变量实际上是被添加到外层的function上的:
image.png
以上两种情况是因为with代码触发了RHS查询机制导致的

RHS简述
在引擎执行的第一步操作中,对变量a进行了查询,这种查询叫做LHS查询。实际上,引擎查询共分为两种:LHS查询和RHS查询

  从字面意思去理解,当变量出现在赋值操作的左侧时进行LHS查询,出现在右侧时进行RHS查询

  更准确地讲,RHS查询与简单地查找某个变量的值没什么区别,而LHS查询则是试图找到变量的容器本身,从而可以对其赋值
image.png
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(...)
四.代码优化问题
代码无法优化
由于无法进行预测,代码含义一直在发生变化,不同的调用,或者即使相同的调用也会因为运行时的变化而出现偏差,从而使得代码无法被优化。

优化指两方面,一方面解析和运行变得缓慢,指的就是之前已经谈到的性能。另一方面对于代码优化和压缩工具来说,无法确定是变量还是属性,就不能进行重命名(因为属性无法被重命名)。


喀秋莎
0 声望0 粉丝