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

Javascript 高级闭包兼容性和静态类型-使用未定义的类型和localStorage.getItem()等全局函数;,javascript,google-analytics,closures,google-closure-compiler,Javascript,Google Analytics,Closures,Google Closure Compiler,我只是想知道什么是正确的方法来检查一个函数是否是未定义的脚本,该脚本将在高级模式下关闭,以及如何访问全局函数 例如,检查是否加载google analytics的示例: typeof window["ga"] == "function" typeof window["ga"] !== "undefined" 但是下面的闭包编译器也是防弹的吗 typeof window["ga"] == function typeof window["ga"] !== undefined 本地存储呢。与mag

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

例如,检查是否加载google analytics的示例:

typeof window["ga"] == "function"
typeof window["ga"] !== "undefined"
但是下面的闭包编译器也是防弹的吗

typeof window["ga"] == function
typeof window["ga"] !== undefined
本地存储呢。与magic一样,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
操作符将为您提供一个描述类型的字符串

函数
不是字符串,后面应该跟某些字符<因此,代码>窗口类型[“ga”]==函数将引发异常

typeof
将始终为您提供一个字符串。字符串永远不是未定义的值<代码>窗口类型[“ga”]!==未定义的将始终为您提供一个
true
结果

所以不,不使用字符串不是防弹的。恰恰相反;这在任何地方都行不通


那么本地存储呢

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

像魔术一样,以下在chrome中工作

if(localStorage!=未定义)

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

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

  • 未定义的
    未被定义为
  • localStorage
    已声明
如果没有声明您将得到一个ReferenceError,并且您的脚本将中止(除非您使用的是try/catch)

因此,不要将变量直接与
未定义的
进行比较


很可能
未定义的
不是您所认为的那样。大多数时候,您关心的是变量的声明和定义。剩下的时间你可以继续使用
typeof
,因为它在任何地方都能可靠地工作,习惯性地使用它比混合和匹配,有时甚至出错要好。

我认为在任何地方都不起作用也不是真的。刚刚检查了未定义的,似乎至少chrome将其转换为允许脏编码的类型。如果使用了本地存储怎么办。如果localStorage不可用,则其不是对象,而是未定义的类型。因此,如果不关闭,比较类型而不是typeof作为字符串是有效的。至少是铬合金的,但安全吗?thx昆汀。我进一步尝试指定该问题,因为更详细地查看它使我不确定localStorage.getItem在闭包上下文中的用法。