javascript – 带语句的性能影响
作者:互联网
好的,所以,我在过去四十八小时内已经看到了这一点,我需要将其作为一个问题提出来.在“JavaScript for Professional Web Developers”(2012)中,它说的与MDN相同:
Use of the with statement is not recommended, as it may be the source
of confusing bugs and compatibility issues.
然而,Zakas的书还指出(没有进一步的实质性阐述),“[出于性能原因不应该使用它们”.这个问题显然“足够糟糕”,在严格模式下,ECMAScript不允许使用语句.
这是出于性能原因吗?或者,是因为人们无法忍受他们?
如果它在一定程度上取决于性能,它们如何以及为什么会对性能产生负面影响?
解决方法:
with语句的问题都源于同一个问题:使用时,范围变得复杂.
请考虑以下示例:
with (foo) {
with (bar) {
return x;
}
}
这看起来很简单,但它实际上可以有各种可能的结果.
>如果定义了foo并且它有一个名为bar的属性,bar有一个名为x的属性,则返回foo.bar.x.
>如果没有定义foo但是bar是,并且它有一个名为x的属性,则返回bar.x.
>如果定义了foo但没有名为bar的属性,则使用窗口查找检索bar.
名单还在继续.所以行为有各种各样的可能性,所有这些都是脆弱的,因此可能存在错误,但为什么这会出现性能问题呢?
好吧,考虑一下:
return foo.bar.x;
如果没有任何with语句,JavaScript引擎很容易进行优化.在范围内是一个名为foo的变量(使用var声明)?如果是这样,请使用它.如果没有,请执行窗口查找.这几乎可以静态地确定.
使用时,需要在运行时动态确定每个变量查找.如果您在with块中引用了一个全局变量,则引擎仍然必须检查该属性是否存在于与之一起使用的对象上.如果使用块嵌套,则会变得更糟.
使用with会使行为变得如此复杂,以至于在大多数情况下,JavaScript优化器只会放弃,因为它会抛出大量的编译时保证.当范围是动态确定的,而不是词汇,很难推理.
所以是的,这是使用with的另一个原因是一个坏主意.不惜一切代价避免它.
标签:with-statement,javascript 来源: https://codeday.me/bug/20190728/1559665.html