我在我的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?
答案 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版的规格,是非常非常重的。 : - )