Advanced Closure Compatibility and static types - 使用类型如未定义和全局函数如 localStorage.getItem();

Advanced Closure Compatibility and static types - Usage of types like undefined and global functions like localStorage.getItem();

我只是想知道使用将在高级模式下关闭的脚本检查函数是否未定义的正确方法是什么以及如何访问全局函数?

例如检查 google 分析是否已加载的示例:

typeof window["ga"] == "function"
typeof window["ga"] !== "undefined"

但是以下是否也适用于闭包编译器?

typeof window["ga"] == function
typeof window["ga"] !== undefined

那么 localStorage 呢?像魔法一样,以下在 chrome 中起作用:

if (localStorage != undefined ) myvariabel = localStorage.getItem('myvariable')

但在我看来,我喜欢肮脏的编码。在我看来,以下是正确的还是?

if(typeof localStorage != "undefined")
// or even better the following since per definition local storage is an attribute of window:
if(typeof window["localStorage"] != "undefined") myvariabel = window["localStorage"].getItem('myvariable')

在这种情况下,在高级编译器模式下使用 .getItem 是安全的,还是我必须编写代码:

if(typeof window["localStorage"] != "undefined") myvariabel = window["localStorage"]["getItem"]('myvariable')

typeof 运算符将为您提供一个描述类型的字符串。

function 不是字符串,并且期望后跟某些字符。 typeof window["ga"] == function 因此会抛出异常。

typeof 总会给你一个字符串。字符串永远不是未定义的值。 typeof window["ga"] !== undefined 总是会给你一个 true 结果。

所以没有。不使用字符串不是防弹的。恰恰相反;它不会在任何地方工作。


And what about localStorage

这与任何其他变量没有什么不同。

Like magic the following works in chrome

if (localStorage != undefined )

现在您正在测试变量是否等于 undefined,而不是是否使用 typeof。那是一个完全不同的问题。

这会起作用……但前提是:

  • undefined 未被定义为
  • 的不同变量屏蔽
  • localStorage 已声明

如果尚未声明,您将收到 ReferenceError 并且您的脚本将中止(除非您正在使用 try/catch)。

所以没有。切勿将变量直接与 undefined 进行比较。

undefined 与您想象的不一样的可能性很小。大多数时候,您关心的是 声明 以及定义的变量。剩下的时间你可以继续使用 typeof 因为它在任何地方都可靠地工作并且作为一种习惯使用它比混合和匹配更好,有时会出错。