1

当我编写依赖于从同一页面引用的另一个脚本文件创建的对象的代码时,我经常发现自己必须测试一些全局变量或其他变量的存在。

我希望这样做的逻辑成语如下:

if (window.myLibrary) myLibrary.someFunction();

然而,在对 stackoverflow 进行一些研究之后,共识似乎是正确的成语是这样的:

if (typeof myLibrary != "undefined") myLibrary.someFunction();

这个成语在stackoverflow的几个答案中给出,最突出的例子是这个:

如何检查是否在 javascript 中定义了变量

但是,我找不到任何解释为什么第二个版本更可取。对它的所有建议都采用“仅使用它”的形式。有人可以解释为什么使用 typeof 运算符优于通过将其作为窗口对象的属性来检查对象吗?

4

2 回答 2

4

myLibrary 可以存在但设置为 0 或 false 在这种情况下,第一个示例将假定它根本不存在。

于 2013-05-17T14:53:33.613 回答
3

我倾向于使用第一个示例,除非有一些非常令人信服的理由可以将库设置为“true”或类似的东西。是的,如果您的代码在其他人的环境中运行(即,您正在构建像 JQuery 这样的公共 Javascript 框架),您可能希望通过类型检查尽可能安全,以确保有人不会滥用该库。但在我看来,Javascript 中完美的类型安全并不是那么重要,以至于你的所有代码都非常冗长,有时难以阅读。

我也喜欢链接问题的答案;您可以使用

if ('myLibrary' in window)

我认为那只是偏好。澄清一下,即使 window.myLibrary 为“假”,它也会评估为真,因此您基本上是在检查它是否已被定义。

于 2013-05-17T15:00:14.383 回答