gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:43:28 27 4
gpt4 key购买 nike

我在我的 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?

最佳答案

I wasn't able to find an explanation to as why this doesn't throw an error.

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

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

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

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

if (typeof AdMob === "undefined")

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

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

...it would just indeed help to see the exact official specification which confirms this.

那将是 ECMAScript specification , 具体来说 §6.2.3.1用于在无法解析的符号上抛出 ReferenceError,以及 §9.1.8为不存在的属性返回 undefined。但我应该警告您,该规范,尤其是第 6 版规范,非常非常繁重。 :-)

关于javascript - 为什么 window.something 不抛出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35334368/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com