使用 require 在 JavaScript 中访问匿名函数外部的全局变量

Access global variable outside of anonymous function in JavaScript using require

我正在开发一个 HTML5 实时多人游戏,我有一个 game_core.js 文件,其中 运行 使用 p2 库的游戏物理。我想 运行 这个文件在客户端和权威服务器上都可以进行预测。这是构造函数和 module.exports:

function gameCore() {
    this.world = new p2.World({gravity:[0, 0]});
    this.players = {};
    this.step = 1/60;
}

...

module.exports = gameCore;

因为我在 index.html

中加载 p2.js 文件
<script type="text/javascript" src="lib/p2.js"></script>
<script type="text/javascript" src="game_client.js"></script>
<script type="text/javascript" src="game_core.js"></script>

构造函数找到 p2 对象,一切正常。但是我的问题是当我尝试 运行 服务器上的这个文件时,因为我找不到访问 p2 对象的正确方法,它是 game_server.js:[=17= 上的全局变量]

var
    io              = require('socket.io'),
    express         = require('express'),
    UUID            = require('node-uuid'),
    p2              = require('p2'),
    verbose         = false,
    http            = require('http'),
    app             = express(),
    config          = require('./config.json'),
    gameCore        = require('./game_core.js'),
    server          = http.createServer(app);

var world = new gameCore();

我收到这个错误:

this.world = new p2.World({gravity:[0, 0]});
                         ^
ReferenceError: p2 is not defined

如果我在 gameCore 上创建一个 p2 属性,在构造函数中将 world 保留为 null,将全局 p2 分配给 gameCore 的 p2,然后使用初始化函数将正确的值分配给 world

function gameCore() {
    this.p2 = null;
    this.world = null;
    this.players = {};
    this.step = 1/60;
}

gameCore.prototype.init = function() {   
    this.world = new this.p2.World({gravity:[0, 0]});
}

它有效,但由于我需要在 gameCore 的其他 类 上执行此操作,我得到了堆栈溢出。如果我使用

var p2 = require('p2');

在 gameCore 上它可以工作,但客户抱怨使用 require。

我是JavaScript的新手,但我看过闭包、匿名函数和许多类似的疑惑。不幸的是我还没有解决这个问题。

browserify 允许您在客户端 js 文件中使用 require。

如果你想在构造函数中使用 p2,你还需要 game_core.js require p2。

您使用 browserify 的客户端文件应如下所示

<script src="bundle.js"></script> <!-- browserify p2 game_core.js config.json --->
<script>
  var p2 = require('p2 ');
  var game_core= require('game_core.js');
  var config= require('config.json');
 /* ... */
</script>