Javascript 中变量声明语法(包括全局变量)之间的区别?

2023-11-26

声明变量有什么区别:

var a=0; //1

...这边走:

a=0; //2

...or:

window.a=0; //3

在全球范围内?


是的,有一些差异,但实际上它们通常并不大(除了你的#2 -a = 0;— A) 我强烈建议不要这样做,B) 在严格模式下是一个错误)。

还有第四种方法,从 ES2015 (ES6) 开始还有两种。我在最后添加了第四种方式,但在 #1 之后插入了 ES2015 方式(你会明白为什么),所以我们有:

var a = 0;                             // 1
let a = 0;                             // 1.1 (new with ES2015)
const a = 0;                           // 1.2 (new with ES2015)
a = 0;                                 // 2
window.a = 0; /*or*/ globalThis.a = 0; // 3
this.a = 0;                            // 4

这些陈述已解释

1. var a = 0;

这将创建一个全局变量,它也是全局对象,我们将其访问为window在浏览器上(或通过globalThisES2020 中添加了全局,或通过this在全球范围内)。与其他一些属性不同,该属性无法通过以下方式删除delete.

在规范方面,它创建了一个标识符绑定 on the 对象环境记录为了全球环境。这使得它成为全局对象的属性,因为全局对象是保存全局环境的对象环境记录的标识符绑定的地方。这就是属性不可删除的原因:它不仅仅是一个简单的属性,它是一个标识符绑定,并且标识符无法被删除。

绑定(变量)是在第一行代码运行之前定义的(请参阅“当var发生”如下)。

它创建的属性是可枚举的(除了非常过时的 IE8 及更早版本)。


1.1 let a = 0;

这将创建一个全局变量,它是not全局对象的属性。这是 ES2015 中的新事物。

用规范术语来说,它创建了一个绑定在声明式环境记录为了全球环境而不是为了Object环境记录。全球环境的独特之处在于分裂环境记录,一个用于全局对象上的所有旧内容(Object环境记录)和另一个所有新东西(let, const,以及创建的函数class)不在全局对象上,而是在全局环境中声明式相反,环境记录。

绑定是created在执行其封闭块中的任何分步代码之前(在本例中,在任何全局代码运行之前),但它不是无障碍以任何方式直到逐步执行达到let陈述。一旦执行达到let语句,该变量是可访问的。 (参见“当let and const发生”下面。) 绑定之间的时间created(进入范围时)并成为无障碍(代码执行达到let)被称为颞死区[TMZ]。当绑定处于该状态时,任何对其进行读取或写入的尝试都是运行时错误。

(规范中关于绑定是否可访问的术语是它是否已“初始化”,但不要将“初始化”的使用与在let陈述 [let a = 10;与只是let a;];他们是无关的。定义的变量let a;初始化为undefined一旦let到达了。)


1.2 const a = 0;

创建一个全局常量,它不是全局对象的属性。

A const绑定就像let绑定(包括 TMZ 等),但它有一个标志表明其值不能更改。这意味着您必须提供一个初始化程序(= value部分)提供初始(且不变)值const.

Using const为你做三件事:

  1. 如果您尝试分配给常量,则会导致运行时错误(大多数 IDE 会比这更主动地为您标记它)。
  2. 为其他程序员记录其不变的性质。
  3. 让 JavaScript 引擎在此基础上进行优化const的值不会改变(不必跟踪它是否稍后写入 - 例如,不必检查它是否是有效地持续的)。

重要的是要明白const的值永远不会改变并不意味着一个对象const指的是不可变的。事实并非如此。这仅仅意味着const无法更改,因此它指的是不同的对象(或包含原语):

// This is fine:
const x1 = {a: 1};
console.log(x1.a); // 1
x1.a = 2;
//^^^^^^−−− No problem, just changing the object's state, not the value in the `const` (the object reference)
console.log(x1.a); // 2

// This is not:
const x2 = {a: 1};
console.log(x2.a); // 1
x2 = {a: 2};
// ^−−−−−−− Error here ("TypeError: Assignment to constant variable"),
// you can't change the value of a `const`
console.log(x2.a);

2 a = 0;

不要这样做。

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

Javascript 中变量声明语法(包括全局变量)之间的区别? 的相关文章

随机推荐

  • Appengine:put_async 不起作用(至少在开发服务器中)?

    NOTE 它在生产中确实有效 我的意思是 当我上传应用程序时 它运行得很好 问题出在开发服务器上 这里有一些代码可以向您展示我正在尝试做什么 e Employee key name some key name name John Bonha
  • Codeigniter - 按字母顺序排列活动记录

    我想知道是否有人可以帮助我解决一些问题 我有一些 ajax 可以调用我的模型中的函数 但我似乎无法按 模型 对输出进行排序 在函数下面我遇到了问题 function get models by brand tree null this gt
  • 警告修复后将被初始化

    晚上好 感恩节快乐 我有以下代码 从我的主代码中取出到一个独立文件中 并且收到一些我想解决的警告消息 这是代码 include
  • 数学函数在现代处理器上需要多少周期

    我们知道现代处理器执行诸如cosine and sin直接在处理器上 因为它们有操作码 我的问题是这些指令通常需要多少周期 它们需要恒定的时间还是取决于输入参数 该时间因处理器型号而异 时间范围通常从数十个 CPU 周期到一百个或更多 许多
  • 查找 UIView 中某个类型的所有控件

    我正在寻找一种自动本地化按钮 文本字段等上的文本的方法 对于此方法 我需要找到 UIView 上的所有 例如 UIButton 我尝试了以下两种方法 但它们都没有像我希望的那样工作 for UIView subView in self vi
  • 如何更改 WPF DataGridColumn 上的第一个排序方向

    现在 默认 当您单击用户可排序的标题时DataGridColumn它在第一次单击时按升序排序 在第二次单击时按降序排序 如何使其在第一次单击时降序排序 在第二次单击时升序排序 我想出了一种方法 不确定这是否是最好的方法 但基本上 当排序事件
  • 将文本中的 YouTube URL 替换为其 HTML 嵌入代码

    如果在字符串中找到此函数 则嵌入 YouTube 视频 我的问题是 仅捕获嵌入视频 iframe 如果有更多视频 则仅捕获第一个视频 并忽略字符串的其余部分的最简单方法是什么 function youtube string autoplay
  • 可以跨 APK 共享资源吗?

    是否可以跨 APK 共享资源 例如 应用程序 A 在 APK A 中 可以从应用程序 B 在 APK B 中 加载图标或布局视图吗 您可以利用获取应用程序资源 这样 只要您至少知道包名称以及要加载的资源的 id 或名称 您就可以从其他应用程
  • Rails will_paginate 自定义路线

    如何将 will paginate 与自定义路由一起使用 我的路线中有以下内容 map connect human readable name controller gt tags action gt show 但据我所知 will pag
  • Eclipse 中的 JavaCompiler 为空

    我的 Java 编译器出现一些错误 我在 Eclipse 之外没有收到错误 但它似乎只发生在 Eclipse Indigo 中 这不是必需的 但如果您有答案 我将非常感激 因为它将帮助我更轻松地调试和测试资源 谢谢您阅读此篇 E ToolP
  • Asp.net core Identity“INSERT语句与FOREIGN KEY约束冲突”

    我使用 ASP NET CORE Identity 创建 ASP NET CORE 应用程序 我创建种子类来保存首次启动应用程序的新用户和角色 在这个种子类中 当我将角色添加到用户时 我收到以下错误 INSERT 语句与 FOREIGN K
  • 如何在 JBoss 中使用 Java“热代码替换”?

    我正在运行 JBoss 4 0 3 SP1 CP04 并使用 Eclipse 3 4 1 的调试器连接到它 两者都使用 JDK 1 6 0 11 当我对方法进行微小更改 例如 将逻辑中的 1 更改为 2 并保存它时 我立即收到标题为 热代码
  • JavaScript 中的 HTML 图像到 pdf 转换器

    HTML 代码 img class imagepdf src www images com someimage alt Smiley face height 42 width 42 我想将此图像转换为 pdf 格式 我在用jspdf 为此
  • 实体的键不符合键值编码

    if win Game was won set completed in puzzle and time Calculate seconds taken int timeTaken int NSDate timeIntervalSinceR
  • Bootstrap 按钮在移动设备上“卡住”

    Whenever I click a button with my mobile device android on a twitter boostrap button but button gets odd styling like th
  • 设置 float:left 时将 div 扩展到最大宽度

    我有类似的东西 div style width 100px menu div div content div 两个浮标都是必需的 我希望内容 div 填满整个屏幕 减去菜单的 100 像素 如果我不使用 float 则 div 会完全按其应
  • 用于不平衡多类多标签分类的神经网络

    如何处理训练神经网络时多标签分类结果不平衡的问题 我遇到的解决方案之一是惩罚罕见标记类的错误 这是我设计网络的方式 类数 100 输入层 第一隐藏层和第二层 100 通过 dropout 和 ReLU 全连接 第二个隐藏层的输出是 py x
  • 动态链接器是 Linux 系统上内核或 GCC 库的一部分吗?

    动态链接器 又名程序解释器 链接加载器 是内核或 GCC 库的一部分吗 UPDATE 28 08 16 我发现默认路径为动态链接器每个二进制文件 即链接到共享库 都使用 lib64 ld linux x86 64 so 2是共享库的链接 l
  • 验证信用卡详细信息

    如何验证信用卡 我需要做卢恩检查 黑莓有没有API可以做到这一点 您可以使用以下方法来验证信用卡号 Perform Luhn check public static boolean isCreditCardValid String card
  • Javascript 中变量声明语法(包括全局变量)之间的区别?

    声明变量有什么区别 var a 0 1 这边走 a 0 2 or window a 0 3 在全球范围内 是的 有一些差异 但实际上它们通常并不大 除了你的 2 a 0 A 我强烈建议不要这样做 B 在严格模式下是一个错误 还有第四种方法
Powered by Hwhale