最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Javascript全局变量在函数范围内未定义

运维笔记admin9浏览0评论

Javascript全局变量在函数范围内未定义

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();
发布评论

评论列表(0)

  1. 暂无评论