#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);