ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript – 带语句的性能影响

2019-07-28 08:43:19  阅读:192  来源: 互联网

标签:with-statement 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有