如何彻底清除属性值和javascript对象的引用?

时间:2012-03-05 22:49:23

标签: javascript jquery design-patterns coffeescript

我昨天在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并提高了可读性。

1 个答案:

答案 0 :(得分:1)

delete game不会删除对象,只会删除引用。问题是对旧变量的引用在某处持续存在。可能还有其他人,但至少这部分构造函数给你带来了问题:

  ($ 'section#board div.cell').bind
    click:      @.makeMove
    mouseleave: @.resetCell

JQuery允许您将多个函数绑定到同一个事件;在这种情况下,旧函数和新函数以及旧函数都持有对旧对象的引用。为了解决这个问题,你应该在表单提交功能中取消绑定:

($ 'section#board div.cell').unbind()
相关问题