编程语言
首页 > 编程语言> > javascript – 带语句的性能影响

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