Почему «this» не обновляется, чтобы ссылаться на новый объект? - PullRequest
0 голосов
/ 18 ноября 2009

Я пишу онлайн-игру, которая позволяет пользователю переходить от одной головоломки к другой, и если пользователь делает ошибки, у каждой головоломки есть кнопка «Пуск снова», позволяющая пользователю запустить только эту головоломку с нуля. Упрощенная версия структуры кода приведена ниже:

function puzzle(generator) {

    this.init = function() {
        this.generator = generator;
        ...
        this.addListeners();
    }

    //fires when the puzzle is solved
    this.completed = function() {
       window.theSequence.next();
    }

    this.empty = function() {
        //get rid of all dom elements, all event listeners, and set all object properties to null;
    }

    this.addListeners = function() {
       $('#startOver').click(function() {
            window.thePuzzle.empty();
            window.thePuzzle.init();
       });
    }
    this.init();
}

function puzzleSequence(sequenceGenerator) {

    this.init = function() {
        //load the first puzzle
        window.thePuzzle = new puzzle({generating json});

    }

    this.next = function() {
        //destroy the last puzzle and create a new one
        window.thePuzzle.empty();
        window.thePuzzle = new puzzle({2nd generating json});
    } 

}

window.theSequence = new puzzleSequence({a sequence generator JSON});

Проблема, с которой я столкнулся, заключается в том, что если пользователь перешел ко второй головоломке, если он нажмет кнопку «Пуск», он загружает первую головоломку, а не вторую. После небольшой отладки я выяснил, что «this» при использовании в методах второй головоломки почему-то по-прежнему содержит ссылку на первую головоломку, но «window.thePuzzle» - которая должна быть такой же, как эта - правильно относится ко второй загадке.

Почему «это» сохраняется при упоминании первого?

Дайте мне знать, если вам нужно больше примеров кода

Ответы [ 2 ]

1 голос
/ 18 ноября 2009

$ ( '# startOver') нажмите (this.empty).

Вы взяли метод empty и отсоединили его от this для передачи в качестве простой несвязанной функции в jQuery. Когда он будет вызван обратно, у него не будет ссылки на исходное значение this. На самом деле, когда функция называется unbound, this будет ссылаться на window, поэтому вы будете перетаскивать свойства, которые, по вашему мнению, являются свойствами, на глобальные.

JavaScript не связывает методы так же, как другие языки. См. Например этот ответ для объяснения того, что он на самом деле делает. Это смущает многих людей; лично я считаю это одним из худших недостатков JavaScript.

0 голосов
/ 18 ноября 2009

Существует очень хорошее (и четкое) описание того, как именно this ссылка обрабатывается в различных контекстах в Quirksmode .

...