术语“全局属性”和“全局变量”是同义词吗?

2023-11-26

全局对象充当顶级词法环境(作用域链的顶部,如果您愿意的话)。这意味着可以通过直接引用(如变量)访问全局属性:

// global code
this.foo = 1;        // creating a global property
foo                  // accessing the global property via a direct reference

这也意味着可以通过属性引用访问全局变量:

// global code
var foo = 1;         // creating a global variable
this.foo             // accessing the global variable via a property reference

解读1

现在,基于上述信息,似乎可以互换使用术语“全局变量”和“全局属性”,这意味着这两个术语代表完全相同的一组全局绑定.


但是,使用创建的全局变量之间有两个区别var ,e.g. var foo = 1;,以及通过赋值创建的全局属性,例如this.foo = 1;:

  1. 全局变量是静态范围,而全局属性是动态添加对全球环境:

    foo // => undefined
    bar // throws ReferenceError
    
    var foo = 1;
    this.bar = 1;
    

    所以,全局变量是绑定的before程序评估,而全局属性受到限制during项目评估,当评估作业时。

  2. 全局变量是不可配置的,即它们不能被删除(更具体地说,它们相应的绑定随后不能从环境中删除),而通过赋值创建的全局属性are可配置。

    // the names "foo" and "bar" are bound to the global environment
    var foo = 1;
    this.bar = 1;
    
    // the binding "bar" can be removed from the global environment subsequently 
    delete this.bar; 
    
    // the binding "foo" cannot be removed subsequently
    

话虽如此,应该注意的是,可以创建不可配置的全局属性:

Object.defineProperty( this, 'bar', { value: 1 }); // non-configurable by default

解读2

现在,根据这一新信息,人们可以说,只有静态作用域的全局绑定才可以称为全局属性和全局变量,而动态添加的全局绑定仅仅是全局属性,而不是全局变量,这意味着术语“全局”变量”代表a subset由术语“全局属性”表示的集合,如下所示:

所有全局变量都是全局属性
只有静态范围的全局属性才是全局变量


那么,哪种解释是正确的呢?这两个术语是否代表同一组绑定,或者一个是另一个的子集?


问题

我确实理解术语“全局属性” - 全局属性是全局对象的属性。然而,术语“全局变量”似乎是模糊的。有些人将其用作“全局属性”的同义词,而另一些人则将其定义为通过var陈述。我的问题的目的是确定这两个含义中哪一个是正确的


好吧,你已经知道我所说的区分变量和附加属性的边缘情况的一切window.

如果你想变得非常非常迂腐,我想你可以将全局范围视为函数范围and一个范围,其中window使用与程序中提供的相同的隐藏配置设置来扩展对象的属性(例如:可以重新分配变量但不能删除)。因此,从这个意义上说,就功能而言,它们是不同的,并且反映了全局范围内的属性和变量的属性。

这样称呼它们是完全可以的。
但大多数人甚至没有意识到其中的区别,更不用说区分这两个术语了。
即使是重要的 JS 作者也提到过设置global variable无意中,通过省略var,实际上,JS 会缩放函数作用域,如果它在没有命中该名称的情况下进入全局作用域,则会附加一个global property使用该数据,而不是global variable.

但这确实把我们带到了症结所在——一个强大、稳定、可靠的 JS 应用程序,与其他应用程序一起生活在现代网页上,真的不应该太关心这些差异。
在这种情况下,目标是使用尽可能少的全局属性和变量。

而且,无论是哪一种,变量/属性冲突的危险都是一样的。
变量不受delete,但是任何有用的程序出现的可能性有多大delete一个从未设置过的属性?

因此,就我个人而言,我认为理解边缘情况是件好事,但我也认为,虽然我内心的学究想要同意存在差异,而且它们并不相近,但我内心的实用主义者一想到人们在这个世界上就感到不寒而栗。正在积极地使用全局范围,这对他们产生了很大的影响。

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

术语“全局属性”和“全局变量”是同义词吗? 的相关文章

随机推荐

  • 是否可以终止正在运行的 Web Worker?

    我有一个网络工作人员使用 ajax 请求运行一项耗时的例行任务 我可以从主线程终止它们而不等待它们完成吗 这就是我生成和终止它的方式 button parse categories click function if parseCatego
  • 使用和不使用额外变量时的奇怪浮点行为,为什么?

    当我在 VC 2013 32 位 无优化 中运行以下代码时 include
  • C# 寻找相似颜色

    我想调用带有参数颜色的方法 但有很多颜色仅存在色度差异 我怎样才能找到与我的颜色只有一点点不同的颜色 例如 AntiqueWhite 和 Bisque Here s调色板 Bitmap LogoImg new Bitmap file1 jp
  • Android - 检测 URL mime 类型?

    在我的 Android 应用程序中 我有从数据库访问的各种 URL 然后打开 WebView 来显示该 URL 通常 该 url 看起来像这样 http www mysite com referral php id 12345 这些引荐链接
  • 将页面添加到活动管理

    我们想要向我们的管理添加一个帮助页面 并且我们正在使用活动管理 gem 此页面不与任何模型关联 因此我正在努力弄清楚如何让链接显示在每个页面的菜单栏中 我知道我有点晚了 但我通常都会迟到 D ActiveAdmin register pag
  • 禁用 EditText 闪烁光标

    有谁知道如何禁用闪烁的光标EditText view 您可以使用 xml 属性android cursorVisible false 或以编程方式 java view setCursorVisible false kotlin view i
  • 从 Java 调用 .NET 程序集:JVM 崩溃

    我有一个第三方 NET 程序集和一个大型 Java 应用程序 我需要从Java应用程序调用 NET类库提供的方法 该程序集不支持 COM 我已经在网上搜索过 到目前为止我有以下内容 C 代码 cslib cs using System na
  • 如何获取 30 天内的下一个最小日期并用作 SQL 中的参考点?

    我有一个记录子集 如下所示 ID DATE A 2015 09 01 A 2015 10 03 A 2015 10 10 B 2015 09 01 B 2015 09 10 B 2015 10 03 对于每个 ID 第一个最小日期是第一个索
  • 这个字符序列“\033[H\033[J””在 C 中起什么作用? [复制]

    这个问题在这里已经有答案了 我在一些随机网站上浏览过以下奇怪的字符序列 当编译并执行时 该序列清除了终端中所有先前的内容 它清除输出流中的缓冲区还是仅清除 tty 缓冲区 int main printf 033 H 033 J return
  • C# ping 我的世界

    所以找到了这个小代码片段 可以让你在 PHP 中 ping Minecraft 服务器 但现在我想在 C 中执行此操作 我尝试自己这样做 但由于某种原因它不起作用 UdpClient client new UdpClient IPEndPo
  • Python 比较 C API 中的对象

    给定两个PyObject s 我如何在 C API 中比较它们 我想到了a b起初 但这显然是不正确的 因为它会比较指针而不是对象 我在找a b not a is b Python C API 中的 Python 等效项 您正在寻找PyOb
  • mvn 测试因 Surefire JDK 版本而失败?

    我正在尝试在我的项目上运行 mvn test 项目本身编译并安装 但 man test 失败并显示以下输出 ERROR Failed to execute goal org apache maven plugins maven surefi
  • 使用Leaflet markcluster,如何在不更改缩放级别的情况下在集群和非集群之间切换?

    我正在使用Leaflet markercluster插件来聚集我的点 然而 用户要求具有在集群视图和非集群视图之间切换的功能 基本上 他们希望以高缩放比例查看所有点 我知道我可以在特定的缩放级别禁用聚类 markers new L Mark
  • 简单的 OpenGL 纹理贴图不起作用?

    我正在尝试找出 OpenGL 中的纹理映射 但无法找到一个简单的示例来工作 正在绘制多边形 尽管它没有纹理而只是纯色 此外 位图已正确加载到 sprite1 中 因为到目前为止我已成功使用 glDrawPixels 我使用 glGenTex
  • python:计算质心

    我有一个包含 4 列的数据集 x y z 和值 比方说 x y z value 0 0 0 0 0 1 0 0 0 2 0 0 1 0 0 0 1 1 0 1 1 2 0 1 2 0 0 0 2 1 0 0 2 2 0 0 我想计算质心CM
  • Python 赋值运算符左侧的多个变量

    有人可以解释一下逗号分隔链的概念吗 可能不是正确的术语 但我不想将其与list 赋值运算符左侧的变量名 我指的是具有以下性质的东西 reader csv reader open some file rb for row in reader
  • 将 GDAL/OGR 合并到 iOS 项目中 - 快速指南

    问题是这样的 GDAL是一个出色的开源库 旨在管理复杂的 GIS 数据 栅格数据和矢量数据 它完全是为Mac OS 由 William Kyngesburye 提供 和其他平台 但不适用于 iOS 浏览网络 您可以找到有关创建 iOS 库主
  • Python Killed:使用从 2 个 csv 文件创建的字典运行代码时为 9

    我正在运行一个一直对我有用的代码 这次我在 2 个 csv 文件上运行它 data 24 MB 和 data1 475 MB data 有 3 列 每列约 680000 个元素 而 data1 有 3 列 每列约 33000000 个元素
  • 更改Jfreechart中图表的X轴起始值

    我正在计算图像红色分量的直方图并将其存储在 redhisto 中 数组的索引代表强度 0到255 该值表示具有该强度的像素数 然后使用 JFreeChart 绘制这些值 我的问题是 如何让X轴的值从0开始 现在是从负数开始 Can we c
  • 术语“全局属性”和“全局变量”是同义词吗?

    全局对象充当顶级词法环境 作用域链的顶部 如果您愿意的话 这意味着可以通过直接引用 如变量 访问全局属性 global code this foo 1 creating a global property foo accessing the