我昨天在javascript中使用coffeescript做了一个简单的游戏。游戏的大部分内容通过game
对象运行,该对象在用户在页面上提交表单后进行实例化。表单包含他们想要玩的游戏的变量和选项。
游戏过程中一切正常,但是当游戏结束时我会再次显示表单,如果用户第二次提交表单,则应该调用相同的函数并覆盖旧的game
变量game
对象的新实例,但我注意到它没有重置原始游戏对象设置的所有现有变量和参数。
有没有办法在实例化新对象时完全删除旧对象及其参数?
这是我的对象在coffeescript中被声明为'class'。
window.Game = class Game
constructor: (options) ->
players = options[0] ? '1'
p1 = p2 = false
@player1 = new Player(options[1] ? 'X', p1 )
@player2 = new Player(options[2] ? 'O', p2 )
@cells = ($ "section#board .cell")
@cells.each ->
$(@).text(" ")
$(@).removeClass('score')
@currentPlayer = @player1
@availableMoves = 9
($ 'section#board div.cell').bind
click: @.makeMove
mouseleave: @.resetCell
setTimeout(@.computerMove(@currentPlayer), 1000) if parseInt(players) is 0
我在通过此功能提交表单后调用此方法。
($ '#gameOptions').submit (event) ->
event.target.checkValidity()
event.preventDefault()
game = new Game [($ '#player-count') .val(),
($ '#player-1-type').val(),
($ '#player-2-type').val()]
即使在重新实例化游戏对象之前添加了一个调用delete game
。幽灵变量仍然存在。为了简洁起见,我发布了coffeescipt并提高了可读性。
答案 0 :(得分:1)
delete game
不会删除对象,只会删除引用。问题是对旧变量的引用在某处持续存在。可能还有其他人,但至少这部分构造函数给你带来了问题:
($ 'section#board div.cell').bind
click: @.makeMove
mouseleave: @.resetCell
JQuery允许您将多个函数绑定到同一个事件;在这种情况下,旧函数和新函数以及旧函数都持有对旧对象的引用。为了解决这个问题,你应该在表单提交功能中取消绑定:
($ 'section#board div.cell').unbind()