gpt4 book ai didi

javascript - 我如何确保全局范围 JS 范围(窗口)保持干净?

转载 作者:行者123 更新时间:2023-11-28 21:10:32 25 4
gpt4 key购买 nike

提供第三方库是危险的,因为使用它的环境可能千差万别。谈到在浏览器中运行的 JS,不小心覆盖了可能被另一个库使用的全局(即 window)属性,可能会破坏严重依赖脚本的网站。

为了避免这种情况,我想自动测试全局范围是否以任何意外的方式被修改,例如:

function foo() {
myVar = 'this becomes global because of a missing var keyword';
}

window.jQuery = 'this is not jQuery at all, breaking everything that uses it';

(我是否遗漏了另一个变体?)

一个典型的例子

我的库打包了特定版本的 jQuery。使用 var myJQuery = jQuery.noConflict(true);,我可以恢复预先存在的 $jQuery。如果我忘记提供 true 作为参数,只有 $ 被恢复,我的 jQuery 版本保留在 window.jQuery 中,可能会破坏其他需要不同版本的库。

我想要一个可以自动检测这种情况的测试。

到目前为止我尝试了什么

使用 JSLint/JSHint 进行静态分析

据我所知,这仅涵盖由于缺少 var 关键字而导致的意外全局变量。显然,无法检测到“故意”window 属性分配。

有 JSHint 的 global 配置选项,它允许我指定是否可以写入全局属性,但在那种情况下,我不必列出所有可能的(或现实的)偶然的我将来可能遇到的全局变量?

执行自定义检查以查找 window.something = ... 分配是否是个好主意?

比较 Jasmine 规范之后的 window 与规范之前的 window 快照

由于我有一套广泛的 Jasmine 测试,在每个规范之前制作 window 的快照,并在规范执行后将当前 window 与该快照进行比较似乎喜欢一个好主意。最大的优势是它涵盖了许多执行路径。由于与某些遗留代码相关的各种原因,如果不进行重大重构就无法解决问题,这会花费比我更多的时间。

与上面相同,但手动

这有点管用,但它几乎涵盖了任何执行路径,可能会留下一些未检测到的泄漏全局变量的情况。

注意在开发过程中不要修改全局范围

我几乎找不到关于自动测试这种场景的资源,所以看起来大多数人只是小心地始终使用 var,确定所有内容的范围,并且,如果绝对必要,请尽可能少地使用全局变量尽可能使用非常独特的名称。也许他们也有策略,如果失败就放手,一旦用户开始提示就迅速回滚。

这种方法并不真正令人满意,因为它缺乏自动测试的严格性。

tl;dr 我想知道什么

  • 是否存在自动测试全局范围污染的现有方法?
  • 如果不是,那么在彻底性和所需的实现工作方面做到这一点的最佳方法是什么?

最佳答案

您可以使用 Object.freeze() :

The Object.freeze() method freezes an object: that is, prevents new properties from being added to it; prevents existing properties from being removed; and prevents existing properties, or their enumerability, configurability, or writability, from being changed. In essence the object is made effectively immutable.

因此这行代码将防止将来修改 window:

Object.freeze(window);

注意这是非常硬核的,会破坏很多代码。使用它后,所有试图修改 window 的代码都会抛出。

关于javascript - 我如何确保全局范围 JS 范围(窗口)保持干净?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30378610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com