代码之家  ›  专栏  ›  技术社区  ›  user2226755

如何使用Nodejs中的全局对象获取常量变量?

  •  4
  • user2226755  · 技术社区  · 7 年前

    我想得到一个常数变量 global object 动态使用,但是 global.myconstant 不起作用但是 global.myvar 作品。

    λ node
    > const myconstant = true
    undefined
    > global.myconstant
    undefined
    > var myvar = true
    undefined
    > global.myvar
    true
    > global.const
    undefined
    

    我想做的是:

    const myconstant = () => { console.log("ok const"); };
    var myvariable = () => { console.log("ok var"); };
    
    const watchlist = {
      myconstant: "file1.html",
      myvariable: "file2.html"
    };
    
    Object.keys(watchlist).forEach((taskName) => {
      try {
        global[taskName](); //doesn't work with const
      } catch (e) {
        console.error("error", taskName);
      }
    });
    

    实际产量:

    error myconstant
    ok var
    

    所需输出:

    ok const
    ok var
    

    现场演示: https://repl.it/repls/SunnyScholarlyPasswords

    如何使用字符串获取常量变量? 不替换 const 通过 var .

    2 回复  |  直到 7 年前
        1
  •  3
  •   CertainPerformance    7 年前

    仅用声明的变量 var 隐式分配给全局对象。如果要创建不可重新分配的属性,应使用 Object.defineProperty 相反。例如,在浏览器中,引用 window 而不是 global :

    Object.defineProperty(
      window,
      'myconstant',
      {
        value: () => { console.log("ok const"); },
        configurable: false
      }
    );
    var myvariable = () => { console.log("ok var"); };
    
    const watchlist = {
      myconstant: "file1.html",
      myvariable: "file2.html"
    };
    
    Object.keys(watchlist).forEach((taskName) => {
      try {
        window[taskName]();
      } catch (e) {
        console.error("error", taskName);
      }
    });
    
    // Won't reassign, and will throw an error in strict mode:
    window.myconstant = 'foo';
    console.log(typeof window.myconstant);

    这个 configurable: false 是键,尽管它是可选的-它默认为 false 无论如何。无法修改或删除不可配置的属性。

        2
  •  0
  •   Estus Flask    7 年前

    描述的行为是自然的,但不是节点REPL,而是模块中计算的代码。模块作用域中的变量不会泄漏到全局变量,因为它们在 module scope ,这适用于 var 和 const . 这将在节点模块中发生:

    const myconstant = 1;
    var myvariable = 2;
    
    console.log(global.myconstant) // undefined
    console.log(global.myvariable) // undefined
    

    之所以在REPL中发生这种情况,是因为代码是在全局范围内计算的。所描述的行为可以在模块范围内复制 eval :

    (0, eval)(`
      const myconstant = 1;
      var myvariable = 2;
    `);
    
    console.log(global.myconstant) // undefined
    console.log(global.myvariable) // 2
    

    这就是 风险价值 和块作用域变量( 常量 等)。在全局范围内定义时, 风险价值 在全局变量上定义属性的结果( global 在节点中),而 常量 不。

    如果要定义全局,则应将其定义为属性:

    global.myconstant = 1;
    global.myvariable = 2;
    

    如果需要定义不被重新分配的全局变量,则应使用描述符(正如另一个答案已经解释的那样):

    Object.defineProperty(global, 'myconstant', {
      value: 1,
      configurable: false,
      writable: false
    });
    

    通常不鼓励在本地使用全局变量,特别是在模块化环境(如Node)中。