高级闭包兼容性和静态类型 - 使用未定义和全局函数之类的类型,如localStorage.getItem();

时间:2015-01-22 09:37:53

标签: javascript google-analytics closures google-closure-compiler

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

E.g。检查是否加载了Google Analytics的示例:

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')

1 个答案:

答案 0 :(得分:2)

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

function不是字符串,预计会跟随某些字符。因此typeof window["ga"] == function会抛出异常。

typeof会一直给你一个字符串。字符串永远不是未定义的值。 typeof window["ga"] !== undefined将始终为您提供true结果。

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


  

那么localStorage

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

  

像魔术一样,以下内容适用于chrome

     

if(localStorage!= undefined)

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

这将有效......但仅限于:

  • undefined未被定义为
  • 的其他变量屏蔽
  • localStorage已宣布

如果尚未声明您将获得 ReferenceError 并且您的脚本将中止(除非您使用的是try / catch)。

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

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