Как я могу сохранить контекст этого в jquery - PullRequest
7 голосов
/ 25 июня 2009

У меня есть что-то вроде этого:

var Something = function(){
  this.render = function(){};
  $(window).resize(function(){
    this.render();
  });
}

Проблема в том, что внутри анонимной функции this указывает на объект окна. Я знаю, что могу сделать что-то вроде:

var Something = function(){
  this.render = function(){};
  var tempThis = this;
  $(window).resize(function(){
    tempThis.render();
  });
}

а есть ли лучший способ? Это выглядит не очень элегантно.

Ответы [ 6 ]

14 голосов
/ 25 июня 2009

Решение, которое вы нашли, - то, которое использует большинство людей. Общепринятое соглашение - называть вашу переменную tempThis "that".

var Something = function(){
  this.render = function(){};
  var that = this;
  $(window).resize(function(){
    that.render();
  });
};
2 голосов
/ 25 июня 2009

Это похоже на ваш лучший вариант, я не думаю, что есть лучший способ. (кто-то исправит мой, если я ошибаюсь).

1 голос
/ 25 июня 2009

К вашему сведению, возможность контролировать это появится в следующей версии JQuery

0 голосов
/ 06 мая 2014

Лучшее решение для минимума переменных - использовать метод Function.prototype.bind ().

var Something = function(){
  this.render = function(){};
  $(window).resize( this.render.bind( this ) );
}

Проблема с этим методом, которая может вызвать будущие осложнения, что означает, что вы должны использовать его экономно, заключается в том, что вам нужно вызвать $(this) для захвата элемента. Итак, я могу предположить, что было бы целесообразно использовать Function.prototype.bind() в вашем методе изменения размера, но не было бы хорошим решением использовать его в функции щелчка, которая может потребоваться для непосредственного нацеливания на элемент, по которому щелкнули.

См. JSFiddle для рабочего примера.

См. Документацию Mozilla для Function.prototype.bind () для получения дополнительной информации

Другие методы применимы, но создание переменной для поддержания контекста этого является нежелательным эффектом в соответствии с вашим вопросом.

0 голосов
/ 25 июня 2009

Это именно то, что я делаю. Это также не относится к jQuery.

var Construct = function() {
    var self = this; //preserve scope

    this.materials = 2000;

    this.build = function(){
        self.materials -= 100;
    };
};

Не забудьте использовать ключевое слово var перед новой переменной области видимости. В противном случае вы создаете новую глобальную переменную. Как локальная переменная, она все еще будет доступна внутри внутренней функции через замыкание.

0 голосов
/ 25 июня 2009

Я делал это таким образом во многих трудных ситуациях. Это не выглядит элегантно, но никогда не подведет. На самом деле это закрытие JavaScript в действии.

JRH

...