JavaScript 中变量初始化是否也被提升

2023-12-04

JavaScript 提升让我很困惑。变量初始化是否被提升?我认为它被提升是因为我们在声明和初始化变量之前访问变量

console.log(a);
var a = 4;
undefined
undefined

undefined 表明变量 a 在代码执行之前声明,这是因为提升。

如果我错了,请纠正我。


TLDR

在 JavaScript 中,变量和函数声明都是提升的。

初始化则不然。


Hoisting意味着 - 无论声明的词汇位置如何 - 标识符在语义上从封闭代码区域(函数或块)的一开始就存在。

这意味着标识符(即变量名)在语义上出现在声明它们的代码行之前 - 如果只是为了保证具有相同名称的标识符之间不会发生混淆。

请注意,提升的标识符可能不会(例如,如果使用声明let) 可供开发人员访问,直到评估变量的声明为止。 IE。函数或块开始执行后的一段时间。这个时期的正式名称是“颞死区".

在 JavaScript 中,变量和函数声明都是提升的。

初始化则不然。

对于声明的变量var,效果是声明可以想象为位于封闭的最顶部function,无论声明的词法(即在代码中)位置如何。

对于严格模式代码中的其他所有内容(function, function*, let, const , class)效果是可以想象声明位于封闭的最顶部block(可能是也可能不是函数),无论它们声明的词汇位置如何。

非严格代码有单独的、更复杂的一套规则对于包含在块内的函数语句。看also.

对于使用声明的变量var,变量本身(默认值为undefined) 可用于从封闭执行上下文的顶部进行赋值和取消引用(读取其值)。

Hoisted var声明自动初始化为undefined.

对于其他所有内容,运行时都知道来自封闭块顶部的标识符,但在执行流移过词法声明点之前,它不可用于赋值或取消引用。 IE。暂时死区已经过去。

Hoisted function/function*声明立即使用提升函数进行初始化。

请注意,在 JavaScript 中,初始化执行上下文(堆栈帧)的算法最后处理函数声明,这意味着function声明似乎被提升“高于”var声明。

这意味着如果一个函数声明和一个var 具有相同的标识符都在同一个函数中声明,标识符将与function(而不是var) 在开始执行封闭函数时。

For let, const and class在控制移过变量的词法声明之前,标识符不会被初始化。

These let, const and class声明类型是在其生命后期才添加到语言中的(ES 2015)。

语言设计者选择这种新行为是为了使 JavaScript 更易于理解,并避免允许在声明的词法点引入之前进行赋值和取消引用的细微错误。

出于这个原因,JavaScript 中曾经有一个最佳实践,即变量应该在其封闭函数的最顶部声明​​。

所以在你的示例代码中:

1  console.log(a);
2  var a = 4;
   undefined
   undefined

在执行之前,当实例化代码的执行上下文(或堆栈帧)时,a被提升到封闭范围的顶部。

a被声明使用var,因此在第 1 行取消引用a inside console.log(a)是允许的,并且自动初始化的值undefined打印到控制台。

在第 2 行,代码将分配4 to a(但不打印任何内容)。

如果在浏览器控制台中运行,则浏览器将自动打印最终语句返回的值。

在这种情况下,结果是var a = 4; is undefined等一下undefined打印到控制台。

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

JavaScript 中变量初始化是否也被提升 的相关文章

随机推荐

  • java 如何使用 JDBC 执行 SQL Dump 数据

    我在使用普通 JDBC 连接执行 sql 转储数据时遇到错误 我不知道出现错误的原因是什么 请帮我 try Connection con1 Connection DriverManager getConnection jdbc mysql
  • HTML 文本区域水平滚动

    我想为 HTML 页面中的文本区域提供水平滚动 如果我输入没有换行符的长行 则滚动条应该显示而不换行 一些朋友建议使用overflow y CSS属性 这对我不起作用 我使用的浏览器是 IE 6 和 Mozilla 3 我想出了一种不符合
  • 如何使光标可以输入jtextfield,但为其提供文本的唯一方法是单击按钮?

    我有 jTextfield 和 jButton how to 用户可以单击 jTextfield 鼠标可以在 jtextfield 上进入 退出 但如果用户输入某些内容 它将不会执行任何操作 除了退格键会删除整个文本 当用户单击该按钮时 它
  • 初始化中隐式解包的可选值 - Swift

    当编写一个新的 swift 类时 当 不 使用隐式展开的选项而不是简单的选项时 我仍然不是 100 舒服 据我所知 如果您从未期望它的值为零 则将某些内容分配为隐式解包 并且可选 应该可以 如果它为零 则这是一个异常事件 应该会导致运行时错
  • 当主页视图导航到登录视图时,如何触发登录的useEffect?

    基本上在login我有一个函数可以验证令牌是否存在 如果存在则自动重定向到home视图 否则它将保留在login view Login const Login props gt const loading setLoading useSta
  • 如何编写 lambda 处理程序以将数据发送到 Elasticsearch

    下面是将数据发送到本地Elasticsearch的代码 r Name Dr Christopher DeSimone Specialised and Location Health Name Dr Tajwar Aamir Aamir Sp
  • 使用命令行界面的文件中的整数数量

    如何使用egrep计算文件中整数的数量 我试图将其作为模式发现问题来解决 实际上 我面临着如何表示字符范围 0 9 的问题不断地其中包括开头之前的 空格 和结尾之后的 空格或点 我认为后者可以分别使用 来解决 另外 它之间不应包含点 否则它
  • 将 C++ 代码转换为 C#:SendMessageTimeout()

    首先是 SendMessageTimeout 的文档 http msdn microsoft com en us library windows desktop ms644952 28v vs 85 29 aspx 我有这个 C 代码 我想
  • jQuery AJAX 与传统 true 一起使用好不好?

    首先 我不知道传统在Ajax设置中意味着什么 其次 在ASP MVC中有没有什么情况需要将其设置为true 看名字 估计是要贬值了吧 不是吗 jQuery API 文档 http api jquery com jQuery Ajax jQu
  • 在自托管 ASP.NET Core 微服务中启动多个后台线程

    我在哪里可以创建多个长时间运行的后台线程Self Hosted Self Contained ASP NET Core Microservice谁的生命周期与微服务生命周期相同 因此 从线程检索的信息可以作为对请求的响应发送 尝试了给定的代
  • 将 2d 数组从 PHP 传递到 JavaScript 的最佳方法?

    我想在 JavaScript 代码中使用一个 PHP 数组 我宁愿不做类似的事情对于其中的所有元素 因为它的数量未知 我本来打算做一个 while 循环来将一些数据写入元素中 但目前我似乎找不到一种简单的方法来做到这一点 如何以最简单的方式
  • 带有自定义图像 CSS 代码的复选框不起作用

    我正在尝试将自定义图像添加到复选框 并且我正在使用以下代码 input type checkbox display none input type checkbox label background image url images che
  • 使用 R 上的“高频”包转换 .csv 文件以进行进一步操作

    The highfrequency包已以转换的方式创建 txt and csv文件分别从 NYSE TAQ 和 WRDS TAQ 存入 RDataxts 对象的文件 然后可以通过包轻松操作这些文件 问题是我对 WRDS 数据库的访问权限有限
  • SQL 中是否始终需要 ID 列?

    更具体地说 我创建了一个带有标签系统的新闻模块 由于每个标签都是唯一的 作为管理员 您不允许创建 2 个相同的标签 因此 id 列仍然有用吗 我想不是 但我想知道表演 编号 mews 标题 日期 news id tag id id 标签名
  • 为什么 ARKit 应用程序在几天后停止工作?

    我在 Unity 中为 iOS 开发了一个简单的 ARKit 应用程序 它工作得很好 但有一个奇怪的问题 几天后它就停止工作了 因此 当我点击 iPhone 上的应用程序图标时 它会打开该应用程序一毫秒 然后立即退出 如果我再次重新安装该应
  • 运行 webpack 后 Javascript 函数未定义

    这是我的 webpack config js module exports entry src index js path relative to this file output filename frontEnd bundle js p
  • 版本控制中的项目结构

    我知道在版本控制中至少有 10 种不同的方式来构建项目 我很好奇正在使用的一些方法是什么以及哪些方法适合您 我曾经使用过 SVN TFS 目前 不幸的是 VSS 我见过版本控制的实现非常糟糕 也还可以 但从来都不是很好 为了让事情顺利进行
  • AWS lambda函数无法访问互联网

    我正在运行一个 lambda 函数 我想访问私有数据库服务器和互联网 我可以很好地访问数据库 但无法访问互联网 设置 VPC 10 0 0 0 16 Public Subnet 10 0 0 0 24 NAT Security Group
  • Android 中滚动“突出的顶部应用栏”的应用中的延迟滚动行为

    Current unexpected behaviour Required scrolling behaviour 我在带有滚动 突出的顶部应用栏 的 Android Kotlin 应用程序中遇到了一些意外的滚动行为 所需的行为是内部片段的
  • JavaScript 中变量初始化是否也被提升

    JavaScript 提升让我很困惑 变量初始化是否被提升 我认为它被提升是因为我们在声明和初始化变量之前访问变量 console log a var a 4 undefined undefined undefined 表明变量 a 在代码