【问题标题】:How to emulate "window" object in Nodejs?如何在 Nodejs 中模拟“窗口”对象?
【发布时间】:2021-08-03 16:42:53
【问题描述】:

在浏览器中运行时,附加到“窗口”对象的所有内容都将自动成为全局对象。如何创建类似于 Nodejs 中的对象?

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

【问题讨论】:

    标签: javascript node.js v8


    【解决方案1】:

    您可以为此目的使用预定义对象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 对象。有关更多信息,请查看 nodejs require 的工作原理。
    • 感谢您的回答和通知。我找到了这个简单的解决方案:var mySpecialObject = global.在浏览器中(在全局范围内):mySpecialObject = this.
    【解决方案2】:

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

    【讨论】:

    • 我的意思是我想创建一个类似于“窗口”的特殊对象。将“foo”附加到它将使“foo”全局化。
    【解决方案3】:

    您可以使用 GLOBAL 对象。

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

    【讨论】:

      【解决方案4】:

      如果您要将 Web 控制台与在终端中运行的节点(均为 Javascript)进行比较:

      window global(注意:GLOBAL 已弃用)

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

      在节点(终端)中:global.url

      document process(注意:程序进程正在运行)

      在 Web 控制台中:document.title

      在节点(终端)中:process.title

      【讨论】:

        【解决方案5】:

        我找到了这个简单的解决方案:

        var mySpecialObject = global;
        

        在普通浏览器中:

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

        【讨论】:

          【解决方案6】:

          无论环境如何,您现在都可以使用globalThis 而不是globalwindow。每个最新的浏览器和 Node 12+ 都支持它。它是 ES2020 的一部分

          【讨论】:

            猜你喜欢
            • 2012-02-13
            • 2013-02-10
            • 2019-10-13
            • 1970-01-01
            • 2022-06-13
            • 1970-01-01
            • 1970-01-01
            • 2019-10-05
            相关资源
            最近更新 更多