为什么window.something不会抛出错误?

时间:2016-02-11 08:36:37

标签: javascript cordova ionic-framework

我在我的Ionic应用程序中使用AdMob插件,正如您在the documentation中看到的那样,测试插件是否正确加载的方法是:

if(AdMob) {
    ///other config code...
}

现在,这在设备上非常精细。但是,它在浏览器中无效; ;它在控制台日志中引发错误:AdMob is not defined

我找到了一个测试插件存在的解决方案(不会在控制台中抛出错误):

if (window.AdMob){...}

我在StackOverflow上看到了多个问题的用法。但是,我无法找到解释为为什么这不会引发错误。

我有一个模糊的推理,为什么会这样,但如果有经验的人可以更详细地解释它,我会非常感激。

编辑:我做了这样的其他测试:

var a = "hi";
console.log(a); //shows "hi"
console.log(b); //throws an error that b is not defined

var c = {};
c.b = "hi again";
console.log(c.b); //shows "hi again" as expected

//and now for the grand finale
console.log(c.something);//doesn't throw an error, please explain to me in more detail why?

1 个答案:

答案 0 :(得分:4)

  

我无法找到解释为什么这不会引发错误。

在第一个示例中,您尝试读取完全未定义的标识符的值。在第二个示例中,您尝试从对象可能没有的对象中读取属性。

尝试读取未定义标识符的值为ReferenceError; JavaScript引擎不知道那个标识符是什么。相反,尝试读取对象不具有的属性的值会产生值undefined

这就是语言的设计方式,Brendan Eich在这里设计了这条线:可以从对象中读取不存在的属性的值,但不能读取未声明的标识符的值。

我应该指出第三个选项:typeof。您可以提供未定义的标识符作为typeof的操作数:

if (typeof AdMob === "undefined")

即使ReferenceError未声明,也不会抛出AdMob;相反,typeof将产生"undefined"。 (如果"undefined'是声明的标识符,其中包含值AdMob,它也会产生undefined。)

在对另一个答案的评论中,你说:

  

......确实有助于查看确认这一点的确切官方规范。

这将是ECMAScript specification,特别是§6.2.3.1,用于在无法解析的符号上投放ReferenceError§9.1.8用于返回undefined以查找不属于该属性的属性不存在。但是我应该警告你,这个规格,特别是第6版的规格,是非常非常重的。 : - )