Javascript全局变量在函数范围内未定义
我是JavaScript新手并尝试创建一个简单的节点服务器。这是我的代码:
var activeGames = {}
exports.initialize = function(){
var gameID = "game12345"
activeGames.gameID = new Game(gameID, "player1", "player2")
}
我从另一个模块调用initialize函数,我得到一个错误,指出activeGames未定义。 activeGames位于文件的最外层。我尝试在activeGames.gameID之前添加'this',但是没有修复它。为什么activeGames未定义?提前致谢。
编辑:这是我如何调用此代码。
在我的基本索引文件中
const handler = require("./request-handler.js")
handler.initialize()
在request-handler.js中,我有
var gameManager = require('./game-manager')
exports.initialize = function(){
gameManager.initialize()
}
回答如下:
JavaScript具有词法范围,而不是动态范围。 ref:https://en.wikipedia/wiki/Scope_(computer_science)#Lexical_scoping
词法范围意味着变量是否可访问取决于它们在源文本中的出现位置,它不依赖于运行时信息。
例:
function foo() {
var bar = 42;
baz();
}
function baz() {
console.log(bar); // error because bar is not in the scope of baz
}
您的代码中出现同样的问题,
是活跃的游戏
不在范围内。
试试这个变化:
exports.initialize = function(){
var activeGames = {}
var gameID = "game12345"
activeGames.gameID = new Game(gameID, "player1", "player2")
}
一个好的解决方案可能是使用一个类并导出它: - 这个代码没有被测试 -
class gamesManager {
var activeGames = {}
initialize() {
var gameID = "game12345"
activeGames.gameID = new Game(gameID, "player1", "player2")
}
}
exports.gamesManager = gamesManager
使用:
const activeGames = require('./game-manager');
const activeGamesInstance = new activeGames.gamesManager();
activeGamesInstance.initialize();