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(...)
四.代码优化问题
代码无奈优化
因为无奈进行预测,代码含意始终在发生变化,不同的调用,或者即便雷同的调用也会因为运行时的变动而呈现偏差,从而使得代码无奈被优化。

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