【问题标题】:The value of a constant variable inside IIFE is being changed outside of it? How is this possible? [duplicate]IIFE 中的常量变量的值在它之外被改变了吗?这怎么可能? [复制]
【发布时间】:2021-07-16 23:01:03
【问题描述】:

我在 IIFE 中有一个常量变量。这个变量正在被返回,我不知道为什么可以改变它。

我的代码如下所示:

const main = (function(args) {
    "use strict";

    let window = args.window, document = window.document, location = window.location;
    let $ = args.jQuery || null;

    const CONSTANTS = {
        config: {
            appRoot: "http://localhost/development/.../console/",
            apiRoot: "http://localhost/development/.../api/"
        }
     }

    return {
        CONSTANTS
    };
}({ window, jQuery }));

console.log(main.CONSTANTS);
console.log(main.CONSTANTS.config.appRoot = null);  /* returns null */
console.log(main.CONSTANTS);  /* value of appRoot is null now */

现在,当我打开控制台并输入main.CONSTANTS.config.appRoot = null 时,它只会返回null。我不想改变这个值。难道我做错了什么?我错过了一些太基本的东西吗?

另外,这个main 存储在哪里?它不存储在窗口对象中,因为typeof window.main 返回undefined & typeof main 返回object

【问题讨论】:

  • 将引用声明为“const”并不会使它所指的内容不可变。
  • 一个后续问题可能会问为什么您需要对象是不可变的?如果是为了“安全”,那么在客户端执行代码时您永远不会满意。
  • 哦,不,这不是为了安全????我实际上在其他一些函数中使用这些,所以我不希望这些值是可编辑的。

标签: javascript iife


【解决方案1】:

不妨试试Object.freeze

const main = (function(args) {
  const CONSTANTS = Object.freeze({
    config: Object.freeze({
      appRoot: "http://localhost/development/.../console/",
      apiRoot: "http://localhost/development/.../api/"
    })
  });

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

console.log(main.CONSTANTS);
console.log(main.CONSTANTS.config.appRoot = null);
console.log(main.CONSTANTS.config = null);
console.log(main.CONSTANTS);

【讨论】:

  • 是的,它适用于我的大多数情况,但在嵌套对象的情况下会失败。
  • @Rocker2102 我的示例有嵌套对象,它似乎工作。您能否更具体地说明如何使其不起作用? (注意:我的示例使用了两次 Object.freeze。)
  • 是的,感谢您的所有帮助,但是如果我在对象中有更多属性怎么办。这会导致很多我认为不好的 Object.freeze()?
  • @Rocker2102 也许以下帖子中的一个答案会有所帮助:stackoverflow.com/questions/34776846/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多