【问题标题】:'Global' object in node.jsnode.js 中的“全局”对象
【发布时间】:2011-05-07 04:41:29
【问题描述】:

我正在使用 0.3.1-pre Node.js

这样做:

typeof global.parseInt

结果

'undefined'

但是,在输入“全局”后在控制台中按 [Tab] 时。给出一个函数列表,包括 parseInt。

那么 parseInt 是否是 global 命名空间的成员?

【问题讨论】:

  • 你为什么不干脆做typeof parseInt?这对我有用。
  • 是的。我只是想知道这种特质的原因是什么。

标签: namespaces node.js


【解决方案1】:

从 NodeJS v0.8.14 开始,全局似乎可以跨模块工作,就像浏览器中的窗口对象一样。

测试:

a.js:

a1 = console.log;  // Will be accessed from b.js
global.a2 = console.log;  // Will be accessed from b.js

require('./b.js');

b1('a: b1');
b2('a: b2');
global.b1('a: global.b1');
global.b2('a: global.b2');

b.js:

a1('b: a1');
a2('b: a2');
global.a1('b: global.a1');
global.a2('b: global.a2');

b1 = console.log;  // Will be accessed from a.js
global.b2 = console.log;  // Will be accessed from a.js

运行 a.js 输出:

b: a1
b: a2
b: global.a1
b: global.a2
a: b1
a: b2
a: global.b1
a: global.b2

【讨论】:

    【解决方案2】:

    显然,global 对象不是全局对象,因为 window 在浏览器中。它(根据 #nodejs @ freenode 中的 micheil )实际上只在内部使用。关于全局关闭之类的东西。

    parseIntsetTimeout 以及所有这些伙伴都是全球性的。不属于任何可见的全局对象。

    【讨论】:

    • 无论你对全局对象做什么,都会随时失效。每当内部节点进程执行需要使用它的操作时,它都会重置。因此,对于任何持久性全局变量,它(根本)都不可靠。事实上,我看到它工作超过半秒的唯一地方是在 node-repl(命令行)中。
    • 感谢您的评论。太可悲了:(,尤其是当许多地方的许多人将您指向全局对象时
    • 我看到他们更新了 global 的文档(对于它的实际作用总是有些混乱)。它现在确实包含您设置的“全局”变量(在任何函数范围之外),但是每个模块都有一个新的全局对象,因此它不是跨模块的。 index.js 中的var a = 1 将仅在 index.js 中以global.a 的形式提供。
    【解决方案3】:

    在没有varapp.js 中定义变量,就像myvar='someval' 使其在项目中的每个.js 中可见

    【讨论】:

    • 这是对这个问题的直接回答吗?我不这么认为。
    • 这是对问题背后的可能意图或其他人登陆这里的意图的回答。就像任何答案一样。谢谢 bFunc。
    【解决方案4】:

    失败

    if( global[ some_object_i_want_to_exist ] ){ ... }
    

    作品

    //: outside of all functions, including IIFE.
    const THE_GLOBAL_YOU_PROBABLY_WANT_IS_THIS=( this );
    
    //: Within a function:
    const G = THE_GLOBAL_YOU_PROBABLY_WANT_IS_THIS;
    if( G[ some_object_i_want_to_exist ] ){ ... }
    

    我假设您访问了有关 node.js 中的“全局”的页面,因为您需要等效的“窗口”来检查全局声明的变量。 bFunc 的解决方案对我不起作用,因为它似乎需要明确地执行以下操作:

    global.some_object_i_want_to_exist = whatever;
    

    作为使用的先决条件

    global[ some_object_i_want_to_exist ]
    

    编辑:查看我的代码似乎我的解决方案有效的唯一原因是因为我在其他地方使用了“exports.some_object_i_want_to_exist” 文件。没有它,我的解决方案将失败。所以......我不知道如何可靠地确定对象是否存在于 Node.js 的给定范围内。

    这里是关于全局对象的文档: https://nodejs.org/api/globals.html

    我将把我的答案留在这里,因为我听说当你错了时人们更有可能纠正你,所以也许有人会用问题的答案纠正我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-20
      • 2011-06-18
      • 2016-05-06
      • 1970-01-01
      • 2016-05-09
      • 2014-10-14
      • 2013-03-13
      • 1970-01-01
      相关资源
      最近更新 更多