Имеет ли ссылка на это для легкого обзора хорошую или плохую идею? - PullRequest
3 голосов
/ 26 января 2011

Я иногда назначаю этот указатель на var.Преимущество этого состоит в том, что я не теряю возможности в анонимных функциях обратного вызова.Это хорошая или плохая идея?

Пример:

var Foo = (function($) {
  var Foo = function() {
    var self;

    self = this;

    this.init = function() {
      $('#foo').click(function(e) {
        self.onClick();
      });
    };

    this.onClick = function() {
      console.log(this);
    };

    this.init();
  };

  return function() {
    return new Foo();
  };
})(jQuery);

Спасибо!
{Джим}

Ответы [ 5 ]

3 голосов
/ 26 января 2011

Если вам нужна ссылка на значение this содержащей области (что, безусловно, является разумным требованием), это должно быть хорошей идеей, особенно в тех случаях, когда вы не контролируете вызов функции (например, функции обработчика событий), где это ваш единственный вариант.

1 голос
/ 26 января 2011

Нет ничего плохого в том, чтобы делать это таким образом, за исключением того, что вам, возможно, придется придумывать больше синонимов для "this" и "self", если вложение ваших областей становится глубже, чем один уровень.Мой предпочтительный метод для привязки к определенному значению «this» - использовать Function.prototype.bind , который является частью спецификации ECMAScript 5 и теперь внедряется в браузерах.На данный момент, насколько мне известно, только Google Chrome поддерживает его изначально, но его легко вставить в полифилл, как я это делал в течение некоторого времени.

1 голос
/ 26 января 2011

Это не плохая идея.Является ли это идеей хорошая , в основном стилистическая.

Альтернативный способ написания вашего кода - сохранить ссылку на функцию onClick в замыкании.Однако this не будет привязан к функции onClick при ее вызове таким образом.Например:

var Foo = (function($) {
  var Foo = function() {
    this.init = function() {
      $('#foo').click(function(e) {
        onClick();
      });
    };

    var self = this;  // Or use ES5's Function.prototype.bind

    var onClick = this.onClick = function() {
      console.log(self);
    };

    this.init();
  };

  return function() {
    return new Foo();
  };
})(jQuery);

Я предпочитаю этот стиль использовать self (или that или любое другое имя, которое вы выбрали), если все методы объекта находятся в замыкании (как в вашем случае).

1 голос
/ 26 января 2011

Это не хорошая и не плохая идея.Это ваш единственный шанс сохранить ссылку на внешнюю область действия / контекст .


Меня попросили более подробно, вот мы:

A this значение - это специальный объект, связанный с execution context.Следовательно, можно сказать, что это объект контекста (объект, в контексте которого активирован контекст выполнения).

  • В глобальном контексте this является самим глобальным объектом.
  • В случае контекста функции this в каждом вызове функции может отличаться.this определяется при входе в контекст, и в случае с кодом функции значение может быть абсолютно разным каждый раз.

И даже это , то есть очень краткое резюме по всей теме.Но, надеюсь, вы понимаете, почему вам нужно сохранить ссылку для this value, чтобы получить к ней доступ из другого контекста функции.

0 голосов
/ 26 января 2011

Кажется, это единственный способ сохранить ссылку на область.Но не делайте этого (из вашего примера):

var self;
self = this;

Вместо этого объедините их в одну строку:

var self = this;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...