JavaScript:let、const 提升的区别? [复制]

2024-03-07

背景

我有一个函数负责生成随机数并使其可用。

"use strict";

module.exports = function(args) {
    let {
        min,
        max,
    } = args;

    let currNumber = genRandom(min, max);

    const genRandom = (min, max) => Math.floor(Math.random() * max) + min;

    const getNumber = () => currNumber;    

    return Object.freeze({
        getNumber
    });
};

Problem

由于我不明白的原因,当我使用 Node.js 7.8 运行此代码时,出现以下错误genRandom is not defined.

但是如果我将代码更改为:

let currNumber = genRandom(min, max);

const genRandom = (min, max) => Math.floor(Math.random() * max) + min;

to:

const genRandom = (min, max) => Math.floor(Math.random() * max) + min;

let currNumber = genRandom(min, max);

然后就可以了!

我不明白为什么会发生这种情况。我以为const and let被吊起就像var,但这让我相信我错了。

Question

有人可以向我解释这种行为吗?


我认为 const 和 let 就像 var 一样被提升,但这让我相信我错了。

并不真地,let and const确实被吊起,或者我喜欢这样称呼它,half- 吊起。之间有两个很大的区别var foo and let foo:范围和初始化。您已经了解范围差异。第二个是与var foo, 这俩宣言初始化 (with undefined) of foo被吊起。和let, 只有宣言 of foo被吊起,而不是初始化. foo只是已初始化当代码的单步执行达到let foo陈述。您不能使用(读取或写入)未初始化的标识符。不能使用标识符的这段时间称为暂时死区 (TDZ)。

即使var,提升的初始化是初始化undefined,不是右侧的值=:

console.log(typeof foo); // "undefined"
foo();                   // TypeError: foo is not a function
var foo = () => {};

您所做的更改,移动了声明getRandom在第一次使用它之前进行准备是正确的做法。 (或者使用函数声明,因为声明作为一个整体[包括函数的创建]被提升。)

我们来看看这个半吊装的东西:

let foo = "outer";
function x()
{
    console.log("...");
    let foo = "inner";
    console.log(foo);
}
x();

(let and const有块作用域,但我正在使用一个函数,因为我将与var一会儿。)

Within x,那个内在foo不能使用,直到let foo line. But,你无法访问外部foo它上面;这失败了:

let foo = "outer";
function x()
{
    console.log(foo);    // ReferenceError: `foo` is not defined
    let foo = "inner";
    console.log(foo);
}
x();

这就是半吊装:宣言的内在的foo已提升,但变量未提升已初始化直到let foo陈述。这意味着你不能使用foo完全高于(甚至不是来自包含范围)let foo线。内部foo遮蔽外部foo贯穿整个函数,但在初始化之前您不能使用它。这涵盖在Let 和 Const 声明 https://tc39.es/ecma262/#sec-let-and-const-declarations在规格中。

这与var:

var foo = "outer";
function x()
{
    console.log(foo);    // undefined
    var foo = "inner";
    console.log(foo);    // "inner"
}
x();

这运行得很好,因为两个声明and的初始化foo (with undefined) 被提升到函数的顶部。 (吊装后,var foo = "inner";行变成一个简单的赋值语句。)所以内部foo遮蔽外部foo整个过程中,也可以在整个过程中访问,最初使用其默认值(undefined) 以及后来的"inner"(一旦分配给它)。

由于 TDZ 是时间性的(与时间相关),而不是空间性的(与范围内的空间或位置相关),因此您可以使用由let or const (or class) above它的声明,只是不before它的声明。这失败了,因为getNumber尝试访问theNumber before它已初始化,同时仍在 TDZ 中:

const getNumber = () => theNumber;

console.log(getNumber()); // ReferenceError

let theNumber = 42;

这有效是因为getNumber访问theNumber after它已初始化:

const getNumber = () => theNumber;

let theNumber = 42;

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

JavaScript:let、const 提升的区别? [复制] 的相关文章

随机推荐

  • 使用 dplyr 和 rle 对条件组中的连续值进行计数

    我的问题与下面提出的问题非常相似 但是我想添加一个附加命令以仅返回序列具有超过 2 个连续值的情况 当给定的序列运行在给定的时代和给定的年份内有超过 2 个连续的数字时 如何计算连续 成功 的数量 即 consec 中的 1 个 类似的问题
  • SQL Server 和 MySQL 同步

    我正在与一个在 SQL Server 和 MySQL 之间同步的客户合作 其中包含完全相同的架构和数据 我们希望将这些数据集中到一个数据库中 除了性能和可维护性问题之外 最初的设计还有什么不好的地方呢 您可以使用 MySQL 实例在 SQL
  • Pandas read_csv,读取缺失值指定为 int 的布尔值

    我正在尝试将 csv 导入到 pandas 数据框中 我有用 1 和 0 表示的布尔变量 其中缺失值用 9 标识 当我尝试将 dtype 指定为布尔值时 我会收到许多不同的错误 具体取决于我尝试的内容 示例数据 test csv var1
  • 在 PowerBI 报告中排除周末?

    我在 Power BI 中有一个 VS Team Services 项目的燃尽图 这样我们就可以报告故事点 而不是剩余的工作量 在图表中 X 轴上有日期 有没有办法从图表中过滤掉周末日期 周末没有活动 I found 这个论坛帖子 http
  • 使用 Angular JS 删除 Facebook OAuth 哈希值

    Facebook 喜欢添加 到我们提供的 OAuth 回调 URL 的末尾 虽然我们没有使用基于哈希的导航 但它看起来很烦人 我想摆脱它 location hash 导致无限循环 watch 这也会发生在 window location h
  • 如何在 JSON 响应反应本机上生成动态 UI

    这里我试图生成动态 UI 通过 API 我得到了一些 JSON 格式的响应 我必须在 UI 上绘制它 就像我没有定义任何 TextInput 一样 它应该动态生成 下面是一些示例 JSON 响应 这可能会根据不同的请求而改变 请帮助 我被困
  • 使用 JavaScript 获取 IE9 中的数据列表选项

    这段代码适用于除 Internet Explorer 9 之外的所有主要浏览器 我不明白我做错了什么 这可能是我错过的一些简单的事情 复制此代码 或使用这个jsFiddle http jsfiddle net Jordan PU9BF 在I
  • 长路径 \\?\ 解决方法在某些安装上不起作用

    我正在开发的应用程序需要处理具有很长文件 路径名的文件 这是一个 Net 4 6 应用程序 因此我实现了 4 6 2 之前的解决方法 以允许使用 语法 如概述的here https stackoverflow com questions 4
  • Neo4j Cypher 查询:顺序集合,取前 n 个元素

    我在为这种社交网络类型的应用程序编写 Cypher 查询时遇到问题 它涉及用户添加帖子 本质上是带有描述的图像 用户可以查看这些帖子 在 Cypher 中 图模型是这样的 user WROTE REVIEW gt review EVALUA
  • 如果在循环中抛出异常,则使用 try-with-resources 出现奇怪的“资源泄漏:流永远不会关闭”

    为什么 Eclipse 给出一个奇怪的 资源泄漏 zin 永远不会关闭 即使我使用以下代码 也会发出警告try with resources Path file Paths get file zip Resource leak warnin
  • 根据指定格式将字符串转换为日期时间

    我希望按照指定的格式得到日期格式的最终 结果 即YYMMDD我怎样才能从下面给出的字符串中得到这个 string s 110326 从字符串到日期 DateTime d DateTime ParseExact s yyMMdd Cultur
  • 在 C++ (Qt) 中实现内省

    我想知道是否有人可以为我澄清以下内容 我即将参加与 Qt 相关的测试 示例问题相当模糊 其中一个问题如下 Qt 在 C 中通过以下方式实现自省 A 自动将每个类定义为 QObject b 定义可以在 QObject 类中调用自身的元对象 C
  • Android 相机拍摄的照片尺寸非常小

    我正在尝试从相机捕获图像 压缩它 然后将其存储到 SD 卡 如果我使用下面的代码直接将其保存到 SD 卡 我会得到完整的图像 但如果我尝试在系统中加载图像 我会得到一个超小的图像尺寸 例如 320 x 240 而不是完整的 5 mp 图像
  • 动态创建新的 PropertyInfo 对象

    这是我的第一篇文章 尽管我在某种程度上搜索了与我的问题相关的主题 但我在找到正确的答案时遇到了很多麻烦 我的问题可能很简单 但我知道答案可能并不那么容易给出 如果有的话 话虽这么说 这就是我的情况 作为示例 我有一个 PropertyInf
  • 通过命令行构建和发布 C# .NET Web 应用程序

    我需要能够通用且单独地构建和发布 C ASP NET Web 应用程序 理想情况下 我想使用 MSBuild 来构建应用程序 如果成功 我想简单地发布该网站 最好仅包含文件副本 目前 我可以使用 MSBuild 轻松构建 Web 应用程序
  • 哈希表。怎么运行的?

    现在 我试图了解如何构建Hashtable 最有趣的是 当对象被添加到Hashtable 我在一本书上读到 第一步 已计算hashCode object 接下来 我们确定该对象在Hashtable obj hashCode Hashtabl
  • ActionScript 3 读取 JPEG 质量

    我正在为 Flash 10 开发图像上传器 有没有办法读取浏览图像的 jpeg 质量 不幸的是 它不能直接完成 品质因数未存储 直接在 JPEG 文件中 这样您 无法读取品质因数 文件 from 页数 更详细地说 使用的量化表 压缩图像存储
  • 使用 avcapturesession 切换相机

    在这里使用本教程 http www musicalgeometry com p 1297 http www musicalgeometry com p 1297我创建了一个自定义叠加层和图像捕获AVCaptureSession 我试图允许用
  • 使用 RubyOnRails 上传 HTML5 FormData 文件

    我使用此脚本在 Rails 3 2 8 应用程序中使用 HTML5 FormData 上传文件 逐一 http jsfiddle net RamPr http jsfiddle net RamPr uploader input file o
  • JavaScript:let、const 提升的区别? [复制]

    这个问题在这里已经有答案了 背景 我有一个函数负责生成随机数并使其可用 use strict module exports function args let min max args let currNumber genRandom mi