在 Javascript 中覆盖 undefined 和 IIFE

2023-12-09

我一直在阅读“你不懂Js”系列,并发现了这一点:

“此模式的另一个应用解决了默认值的(次要利基)问题undefined标识符的值可能会被错误地覆盖,从而导致意外结果。通过命名参数undefined,但不为该参数传递任何值,我们可以保证undefined标识符实际上是undefined代码块中的值:“

undefined = true; // setting a land-mine for other code! avoid!

(function IIFE(undefined) {

  var a;
  if (a === undefined) {
    console.log("Undefined is safe here!");
  }

})();

我不明白这里发生了什么事。 undefined 是一种数据类型还是只是一个标识符?这段代码是如何工作的?

Thanks.


undefined(标识符)是一个预定义的全局变量,其值令人困惑的是,undefined,它是 Undefined 类型的唯一成员。 (我没有骗你.)

It used成为那个undefined(标识符)不是只读的,您可以分配给它。这在很久以前就不再成立了(2009 年,截至 ES5);这个日志undefined, not true:

undefined = true;
console.log(undefined);

...但这就是该部分描述的“利基问题”。

A 不同的,但 2018 年真正的、小众的担忧是,你可以shadow the undefined标识符并给它任何你想要的值:

(function() {
    var undefined = true;
    console.log(undefined); // true
})();

因此,如果您的代码可能被放置在其他代码中间,那么您可能正在处理不同的代码undefined标识符比全局标识符。

So,为了处理这种极不可能发生的情况,您可以编写隐藏的代码undefined,但使用正确的值,通过使用将其声明为参数的 IIFE,然后不传入任何值;参数将收到的值将是实际值undefined:

(function() {
    var undefined = true;
    //  ^---- a local variable that shadows (hides) the global
    console.log(undefined); // true
    
    (function(undefined) {
    //        ^---- a parameter that shadows (hides) the one above
        console.log(undefined); // undefined
    })(); // <== Notice we aren't passing any argument for the parameter here
})();

由于我们不传递参数,因此参数接收value undefined(无论值是多少undefined标识符可能保存在任何给定范围内)。

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

在 Javascript 中覆盖 undefined 和 IIFE 的相关文章

随机推荐

  • HashMap 应该是未排序的,但仍然根据键排序

    根据这些 http docs oracle com javase 6 docs api java util HashMap html HashMap LinkedHashMap 和 TreeMap 的区别 java初学者 如何在哈希图中对键
  • Pygame 显示无响应

    因此 我尝试为使用精灵进行 X 和 Y 运动的基本 2D Python 游戏创建基础 然而 尽管这里的代码试图screen fill and screen blit playerX 50 playerY 50 player pygame i
  • 帆蓝图生命周期

    我需要向结果添加一些额外的数据find蓝图 我找到了这个解决方案 module exports find function req res return sails hooks blueprints middleware find req
  • 在 Visual Studio 中引用 system.management.automation.dll

    我开始研究 PowerShell 模型和管理单元开发 我注意到的第一件事是引用 System management automation dll 然而 在 Visual Studio 中 NET 选项卡没有该程序集 也无法浏览到 C win
  • 如何刷新Google地图中的坐标?

    我可以在点击刷新按钮时刷新谷歌地图 但它显示的是旧坐标 在某些区域 它显示矩形图像 其中有十字图像 错误在哪里或者我必须对其进行哪些修改 这是我的代码 public class GmapActivity extends MapActivit
  • Julia:为什么共享内存多线程没有给我带来加速?

    我想在 Julia 中使用共享内存多线程 正如 Threads threads 宏所做的那样 我可以使用 ccall jl threading run 来执行此操作 虽然我的代码现在并行运行 但我没有获得预期的加速 以下代码旨在作为我正在采
  • 是否可以保证使用 @PostConstruct 注解的方法先于同一 bean 中使用 @Scheduled 的方法执行?

    假设我正在定义一个缓存 bean 它将在应用程序启动时初始化 并以固定的时间间隔刷新 如下所示 Component public class Cache PostConstruct public void initializeCache S
  • 如何检查没有。使用 MYSQLI_STMT_PREPARE 和 MYSQLI_FETCH_ARRAY 时返回的行数?

    我以为我可以用MYSQLI STMT NUM ROWS and MYSQLI STMT STORE RESULT检查是否有 返回的行数 参见注释行 1 2 3 但在下面的上下文中似乎并非如此 此代码确实有效 没有注释行 但我试图添加额外的检
  • python 按周或月分割 pandas 数据框,并根据这些 sp 对数据进行分组

    DateOccurred CostCentre TimeDifference 03 09 2012 2073 28138 03 09 2012 6078 34844 03 09 2012 8273 31215 03 09 2012 8367
  • Pandas 在读取 CSV 之前忽略前几行

    我正在使用 Pandas 库和 Python 我有一个 Excel 文件 在 Excel 工作表的顶部有一些标题信息 我不需要这些信息来提取数据 但是 标题信息可能需要更长的行 因此无法预测它有多长 所以 我的数据提取应该从 ID 的地方开
  • 从基础模块调用动态特征代码

    我试图实现一个动态功能 从我的基本模块中我应该调用该功能中的一些方法 但它只能从该功能中调用基本方法 有什么方法可以使功能代码从基本模块访问 我了解未安装功能时会发生什么 我已经使用默认的谷歌文档实现了它 所以我没有不同的代码或实现 今天没
  • 在r中使用read_csv导入多个csv文件

    我有一个包含多个 csv 文件名称的向量 library readr data lt c categories csv customers csv employees csv employee territories csv order d
  • InternalsVisibleTo 属性不起作用

    我正在尝试使用InternalsVisibleToassembly 属性 使 NET 类库中的内部类对我的单元测试项目可见 由于某种原因 我不断收到一条错误消息 MyClassName 由于其保护级别而无法访问 两个程序集都已签名 并且我在
  • 将表单结果从联系表单 7 导出到 PDF (fPDF)

    我正在尝试将用户在 WordPress 中的联系表单 7 中输入的值通过 fpdf 导出为 PDF 这就是我所设置的 我可以生成 PDF 但没有从表单动态生成的值 函数 php add action wpcf7 before send ma
  • 角度 $setPristine() 不起作用

    我正在尝试使用 Angular 的内置表单函数 特别是setPristine 清除用户提交时的表单 我的控制器可以访问 scope newForm 我的形式 及其所有方法 但正在运行 scope newForm setPristine 没有
  • Stringify C 预处理器

    这是我的第一篇文章 所以如果我太含糊或提供了每个人都会直观地假设的信息 请告诉我 我对写作很陌生C我只是想更好地了解预处理 我正在编写一个简单的程序 可以使用直接从控制台接收参数gcc Wall std c99 DSEED argument
  • 如何在 JFreechart 中获取点的菱形形状

    我需要在 JFreechart 中的时间序列上获得 A 菱形形状 但我无法做到这一点 有人可以指导应该在下面的代码中添加哪些代码来实现钻石形状点以及如何更改线条的颜色吗 该程序使用 rs 和 stmt 以及其他从数据库派生并在其他地方定义的
  • Firebase 实时数据库写入/上传数据是否收费?

    还有一个问题与这个类似here 但答案并不能满足我的问题 我具体询问实时数据库中的写入操作 我知道读取 下载将被计费 但是 那实时定价没有提到 上传 或 写入 它只提到 下载 存储和同时连接 但是上传 又名写入 怎么样 这是否意味着它是免费
  • 创建参考 y 值的垂直堆叠条形图(岩性/地层柱)

    我想制作一个堆积条形图 其中 y axis md litho x axis litho 数据 我已经尝试使用我修改过的代码来实现它另一个问题在堆栈溢出上 path pd ExcelFile F Backup JN Litologi lito
  • 在 Javascript 中覆盖 undefined 和 IIFE

    我一直在阅读 你不懂Js 系列 并发现了这一点 此模式的另一个应用解决了默认值的 次要利基 问题undefined标识符的值可能会被错误地覆盖 从而导致意外结果 通过命名参数undefined 但不为该参数传递任何值 我们可以保证undef