【问题标题】:How to protect globals variables for beeing overridden in Node.js?如何保护在 Node.js 中被覆盖的全局变量?
【发布时间】:2015-03-19 19:11:52
【问题描述】:

我想知道是否有任何方法可以确保某些变量不会在 Node.js 程序中被错误地覆盖。

由于无法像在 Java 中那样将 var 设置为 final,我看不出有任何方法可以确保可以从任何地方覆盖的全局变量的稳定性,即使是从 EJS 之类的模板文件中也是如此。

非回归测试、代码审查、使用包等是检测或避免此类错误的一些方法,但我想知道是否可以在 Node 中使用更强大的东西。 p>

【问题讨论】:

  • 您可以将变量作为键/值对存储在对象中,然后根据您的要求将sealfreeze 对象存储。
  • 一个非常有趣的文档,参见密封对象、冻结对象和防止扩展部分:bjorn.tipling.com/advanced-objects-in-javascript

标签: javascript node.js overriding globals


【解决方案1】:

您可以创建不可写或冻结的对象

var obj = {
    test : 'test'
}

Object.freeze(obj);

obj.test = 'something else';

console.log(obj.test); // still "test"

据我所知,没有办法锁定变量,只能锁定对象的属性

【讨论】:

  • 嗯,我明白了。但它是存储库的有效解决方案吗?像猫鼬,_,lodash,那种东西。我想知道冻结整个库是否不会导致执行过程中出现错误。啊,好的...我需要“锁定”整个变量,这意味着不覆盖它,但允许它在库的情况下更改自己的子变量..
  • 如果你必须锁定包含整个库的变量,你做错了什么,应该没有必要做这样的事情。
  • freeze 将冻结属性.. 它不再是可变的。即不能改变..只是冻结..像一个常数..
【解决方案2】:

除了其他人提到的Object.freeze,node.js 还应该支持const 关键字,至少在启用 es6 的情况下运行。 不过,这是针对块范围的变量,而不是针对属性。

另外,Object.defineProperty 可用于定义不可写、不可配置的属性。这也应该适用于模块或全局对象,尽管我自己没有测试过。

【讨论】:

  • 那么,const 甚至可以用于图书馆,如果我理解正确的话?到目前为止,这可能是最好的选择,我仍在运行 ES5,但这不是一个大问题。
  • const 就像let,它不设置属性,它只是将它们放在本地范围链上。
  • 好吧...那么全局 const 根本不可能。但是似乎可以在浏览器上设置一个全局常量:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…,那么为什么不在 Node 中呢?还是我误会了?
  • 在我的浏览器 (chrome 39) 中,我能够为不可覆盖的对象和函数设置常量,并且在全局上下文中,我刚刚尝试过。
  • "那么全局常量是不可能的。" node 与模块一起工作,浏览器没有模块,它们有一个全局命名空间。这是故意的,这样一个模块就不会污染另一个模块,并且它们必须根据需要显式地相互导入。至于设置/导出属性,请参阅我的答案中描述的替代方法。
猜你喜欢
  • 2013-03-18
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多