это != это в javascript (ну, иногда ….)

#javascript #jquery

#javascript #jquery

Вопрос:

Пример 1

 var Reptile = function () {
  var reptile = this;
   this.showBla = function() {
       alert(reptile.bla);
   }
}

var turtle = new Reptile();
turtle.bla = 'whatever';
turtle.showBla();
 

Пример 2

 var Reptile = function () {
   this.showBla = function() {
       alert(this.bla);
   }
}

var turtle = new Reptile();
turtle.bla = 'whatever';
turtle.showBla();
 

Является ли пример 1 законным? Как иногда кажется, все усложняется, чтобы определить «это» непосредственно в конструкторе …?!?

Комментарии:

1. Выглядит просто отлично. Вы ничего не определяете в конструкторе, вы просто сохраняете ссылку. Никаких проблем вообще.

2. Вы не можете определить this себя. Он всегда доступен и не может быть перезаписан.

3. Поскольку оба примера являются пуленепробиваемыми, можете ли вы предоставить код, который иногда все портит?

Ответ №1:

Да, это законно и полезно в тех случаях, когда вам может потребоваться определить функцию внутри функции, которая может быть вызвана таким образом, что «this» будет указывать на что-то другое. В книгах рекомендуется называть эту переменную var that = this;

Ответ №2:

Пример 1 — это обычный шаблон для сохранения ссылки на текущий экземпляр. В ситуации обратного вызова, например:

 setTimeout(turtle.showBla, 0);
 

Пример 1 var reptile... сохраняет this ссылку и покажет 'whatever' . Будет показан пример 2 undefined , если вы вручную не назначите область видимости на вызывающей стороне (например, в jQuery):

 setTimeout($.proxy(turtle.showBla, turtle), 0);