如何在Nodejs中模拟“window”对象?

10

当在浏览器中运行时,与“window”对象相关联的所有内容都将自动成为全局对象。我该如何在 Node.js 中创建类似的对象?

mySpecialObject.foo = 9;
var f = function() { console.log(foo); };
f();  // This should print "9" to console
6个回答

7
您可以使用预定义的对象global来实现这个目的。如果您将foo定义为global对象的属性,则在此之后使用的所有模块中都可用。

例如,在app.js中:
var http = require('http');
var foo = require('./foo');

http.createServer(function (req, res) {
  //Define the variable in global scope.
  global.foobar = 9;
  foo.bar();    
}).listen(1337, '127.0.0.1');

foo.js文件中:

exports.bar = function() {
  console.log(foobar);
}

请确保不要使用var关键字,因为global对象已经被定义。

需查阅文档,请访问http://nodejs.org/api/globals.html#globals_global


但是要注意,与浏览器JavaScript不同的是,全局对象并非真正意义上的全局。它们仍然局限于模块,即JavaScript文件。换句话说,附加到文件的全局对象的任何内容都无法在另一个文件中使用,您必须将其附加到特殊的“module.exports”对象上。有关更多信息,请查看Node.js require的工作原理。 - Juzer Ali
感谢您的回答和通知。我想到了这个简单的解决方案:var mySpecialObject = global。在浏览器中(在全局作用域下):mySpecialObject = this。 - Ngoc Dao

3
你可以将全局内容附加到process而不是window

1
我的意思是我想创建一个类似于“window”的特殊对象。将“foo”附加到它上面将使“foo”成为全局变量。 - Ngoc Dao

3
现在,您可以在任何环境下使用 globalThis 代替 globalwindow。每个最近的浏览器和 Node 12+ 都支持它。它是 ES2020 的一部分。
// BEFORE
global.foo = 9;     // ⚠️ Node only
window.foo = 9;     // ⚠️ Browser only, no service workers

// AFTER
globalThis.foo = 9; // ✅ Everywhere!

0

你可以使用 GLOBAL 对象。

fruit = 'banana';
console.log(GLOBAL.fruit); // prints 'banana'

var car = 'volks';
console.log(GLOBAL.car); // prints undefined

GLOBAL 应该不是小写吗? - Infigon
1
在 Node 的版本中,直到 v0.12.0(发布此回答时),GLOBAL 对象是可用的。然而,现在已经被弃用,并且被小写的 global 替代了。 - caike

0

如果你要比较Web控制台和在终端中运行的Node(都是Javascript):

window <-> global(注意:GLOBAL已被弃用)

在Web控制台中: window.wgSiteName(随机显示功能)

在Node(终端)中:global.url

document <-> process(注意:程序正在运行的进程)

在Web控制台中:document.title

在Node(终端)中:process.title


-1
我已经想到了这个简单的解决方案:
var mySpecialObject = global;

在正常的浏览器中:

var mySpecialObject = this;  // Run this at global scope

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接