为什么引用未声明的变量会引发引用异常,但引用未声明的属性却不会?

2023-12-11

Mozilla 说变量是全局对象的属性。如果对象具有未定义的属性,则尝试访问它不会创建引用异常 - 它只是返回该属性未定义。

如果存在这样一个全局对象 - 那么为什么访问其不存在的属性(即:变量)会产生引用错误?这两种情况到底有什么区别?

Example:

console.log(x) //x is not declared -> reference error


var x = new Object();
console.log(x.property); //console.log: undefined

tl;dr: The way变量的访问方式才是最重要的,而不是变量的存储方式。


首先是一些背景:

变量“存储”的方式基本上有两种。

In a 陈述性的环境,变量存储在用户代码无法访问的内部数据结构中。

In an object环境,变量存储为用户代码可访问对象的属性。全局环境恰好是一个对象环境(它比这更复杂,但让其保持简单)。因此全局变量是全局对象的属性。


那么为什么访问不存在的全局变量会抛出错误呢?因为它是not变量如何相关stored,仅是如何accessed.

foo and window.foo只是访问全局变量的两种不同方式。

评估变量的语言规则 (foo)明确表示如果变量不存在,则抛出引用错误(同样,无论它如何存储)。*

语言规则用于评估财产访问权(window.foo)说如果该属性不存在,undefined应该被退回。

如果你仔细想想,从一致性的角度来看,这更有意义。访问foo无论变量是存储在声明性环境还是对象环境中,都应该具有相同的结果。


*:更准确地说:这是GetValue导致抛出错误的函数。GetValue解析变量时几乎在任何地方都会调用(例外情况是typeof和分组运算符(...)).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么引用未声明的变量会引发引用异常,但引用未声明的属性却不会? 的相关文章

随机推荐

  • 子集数据帧中意外输出的原因 - R

    我有数据框 a 它有一个名为 VAL 的变量 我想统计VAL值为23或24的元素 我使用了两个工作正常的代码 nrow subset a VAL 23 VAL 24 nrow subset a VAL in c 23 24 但是 我尝试了其
  • Plotly Scattermapbox:有没有办法在标记上方和下方包含一些文本?

    在 Plotly 中 使用 Scattermapbox 有没有办法在标记上方和下方显示一些文本 目前 仅当我将鼠标悬停在标记上时才会显示文本 并且该图仅显示我想要显示的文本的一部分 我的输入数据框df area如下 我想显示两个中包含的文本
  • Picasa api 是否允许 CORS Post?

    Picasa api 允许跨域 GET 请求 但是当我尝试发布图像 评论时 出现以下错误 XMLHttpRequest 无法加载https picasaweb google com data feed api user default al
  • 如何使用 Python 逻辑检查回文

    我正在尝试用 Python 检查回文 我的代码非常for 循环密集 在我看来 人们从 C 转向 Python 时犯的最大错误是尝试使用 Python 实现 C 逻辑 这使得事情运行缓慢 而且没有充分利用该语言 我看到this网站 搜索 C
  • 如何跳过数组循环中的第一个键?

    我有以下代码 if POST submit Next foreach POST info as key gt value echo value 如何让 foreach 函数从数组中的第二个键开始 对于相当小的数组 使用数组切片创建第二个 f
  • 为什么自调用不适用于 Spring 代理(例如使用 AOP)?

    请解释一下 为什么对代理的自调用在目标上执行而不是在代理上执行 如果这是故意的 那为什么呢 如果通过子类化创建代理 则可以在每个方法调用之前执行一些代码 甚至在自调用时也是如此 我尝试过 并且我有自我调用代理 public class Du
  • 如何使用标志禁用 Crashlytics iOS 库?

    我正在使用最新的 iOS Crashlytics 库 我希望使用单个标志禁用 crashlytics 我怎样才能做到这一点 PS 我没有按照新的 SDK 集成指南使用设置 API 密钥方法 使用 MAC 应用程序集成 您是否试图阻止 Cra
  • 在哪里可以找到 Facebook cookie?

    我对此有点陌生 所以请耐心等待 我已经通过 Javascript SDK 安装了 使用 Facebook 登录 按钮 效果很好 我还设置了 PHP 代码 facebook php 我可以通过 javascript 成功登录 Facebook
  • 正则表达式引擎是否会跳过比模式短的字符串?

    我想循环一组字符串 在每个字符串上 我想循环遍历一组正则表达式 以确定哪些表达式与我所在的字符串匹配 但是 如果字符串长度短于模式字符串的最大可能长度 我希望正则表达式引擎跳过它 例如 假设我停在字符串 abc 上 并用这个正则表达式测试它
  • Angular >= 4.3,httpClient.get 参数为空

    我正在尝试迁移我的Http要求HttpClient要求 我能够迁移我的post查询 但我在迁移时遇到问题get查询 当我这样做时 我的后端没有分别收到任何参数 它告诉我参数未提供且为空 我做错什么了吗 import HttpClient H
  • 即使使用 EnableDelayedExpansion,%time% 也不会在 for 循环中扩展[重复]

    这个问题在这里已经有答案了 所以我注意到批处理文件的日志中的 time 变量不准确 如下所示 输出包含在代码下方 它在进入 for 循环时获取当前时间 但不会随时更新 这些 zip 文件很大 有时需要几分钟才能解压每个文件 有人知道这里发生
  • 带有导航控制器的选项卡栏应用程序

    我有一个简单的 iPhone 应用程序 有一个选项卡栏和 3 个选项卡 每个选项卡作为一个带有相应控制器的单独笔尖加载 每个笔尖都包含一个表格视图 其中包含一些其他用于搜索 过滤等的控件 我想要的 并且似乎找不到示例 是向应用程序添加一个导
  • Karate - 在 karate-config.js 中设置全局 User-Agent 标头

    所以我写了一些测试功能 我想全局添加 User Agent 标头 我更新了我的空手道配置 js为此归档 我添加下面的代码 karate configure headers User Agent Karete Apache HttpClien
  • 有没有办法在“交互”命令后“期望”和“发送”

    因此 我需要在标准输出上输出远程进程的输出 但我还需要能够 监听 它 并在匹配我的关键字后发送命令 我需要这样的东西 我知道这段代码不正确 它的唯一目的是说明我需要什么 usr bin expect log user 0 spawn ssh
  • 我怎样才能在jquery中获取锚标记内的文本

    div a link1 a a href link2 a div jquery div1 a click function var text div1 a text 在上面的标签上 我想在我点击它的锚标签旁边获取文本 但是单击上面的每个锚标
  • 使用 2 Legged OAUTH / OPEN ID 域帐户通过 Google GData API 批量更新电子表格

    好吧 周末就这样拍摄了 这是我周日晚上最后一次求助 必须使用 2 Legged OAUTH 方法的 Google Marketplace 应用程序需要将 50K 记录写入 Google 文档电子表格 我能够创建记录 调整大小 重命名记录并将
  • 私有设置器仅在发布版本上抛出错误

    我有一个地图图块设置 我正在通过菜单按钮进行更新 我遇到了一个奇怪的情况 我只在发布版本上遇到错误 代码如下 视图模型 private KnownTileSource selectedTile public KnownTileSource
  • R 直方图“x”必须是数字

    我有一个 csv 文件 TwitterCount 其内容如下 Tom 3 Alex 4 Sedgwick 1 并将文件读入r 我正在尝试用我拥有的数据绘制直方图 但它不断产生错误 x 必须是数字 这是我到目前为止的脚本 userc read
  • 带有 COM 接口的 MFC Dll

    我对托管 非托管互操作性和 COM 概念还很陌生 我收到了使用 COM Interop 的建议 以便在 C 中使用我现有的 MFC 代码 但对我来说问题是 我有一个 MFC Dll 它不是有效的 COM 组件 如何使该 MFC DLL 具有
  • 为什么引用未声明的变量会引发引用异常,但引用未声明的属性却不会?

    Mozilla 说变量是全局对象的属性 如果对象具有未定义的属性 则尝试访问它不会创建引用异常 它只是返回该属性未定义 如果存在这样一个全局对象 那么为什么访问其不存在的属性 即 变量 会产生引用错误 这两种情况到底有什么区别 Exampl