【问题标题】:Programmatically add functions to the root node object以编程方式将函数添加到根节点对象
【发布时间】:2011-09-05 12:53:25
【问题描述】:

在普通浏览器js中,我们可以这样做:

window["fname"] = function(){ /* do something */ };

然后我们可以在任何我们想要的地方调用fname - 它现在是一个全局函数。是否可以在节点中做类似的事情,我们向某个对象添加函数,并且可以在文件的其余部分中调用它们:

root["fname"] = function(){ /* do something */ };
fname();

我不是在寻找对所有文件全局起作用的东西,只是在这个文件中保留“全局命名空间污染”的东西,我可以按原样调用所有这些函数,而无需诉诸 obj.fname

【问题讨论】:

  • 这里有一个类似的问题:stackoverflow.com/questions/3691453/…希望对您有所帮助。
  • 是的,他可以使用 with,但它的 邪恶 - yuiblog.com/blog/2006/04/11/with-statement-considered-harmful ;]
  • 不,with 不是一个选项,因为它不允许访问不需要该前缀的其他变量。请参阅 my code 以了解我想要做什么以及它与这个问题的关系。
  • 哦,我知道你想做什么......嗯,我不知道该怎么做^^也许你可以尝试查看 Firebug 调试器的代码库?
  • 它现在可以工作了:p 你只需要将“视图”包装在一个自运行的函数中。

标签: javascript node.js


【解决方案1】:

编辑(为清楚起见):

据我的测试显示 - 您无法访问模块的本地范围。它是(或类似)闭包,您不能以编程方式访问其范围。所以你最好的选择是 global(又名 root)对象,它保留全局变量,但它对整个应用程序都是一样的(所以每个模块都可以访问它)。

所以,你最好每次都做捷径:

var foo = myModule.foo;
var boo = myAnotherModule.boo;

使用“全局”作为命名空间:

global['foo'] = function(){ console.log('foo'); }; // same as global.foo = ...

foo() //prints 'foo' to console

更多:

http://www.reddit.com/r/node/comments/jb4dy/adding_to_the_global_namespace_in_nodejs/

【讨论】:

【解决方案2】:

root 是我想要的对象:

root["foo"] = function(){ /* blah */ }
foo();

【讨论】:

  • 是的,但rootglobal(和GLOBAL)是同一个对象。您可以尝试执行root===global 或查看console.log(root) 的输出,那里有global: [Circular] 声明供自我参考。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-12
  • 1970-01-01
  • 2021-08-22
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多