Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Помогите разобраться с классами (https://javascript.ru/forum/events/37134-pomogite-razobratsya-s-klassami.html)

shumi 09.04.2013 09:08

Помогите разобраться с классами
 
У меня есть класс (ниже упрощенный вариант)
function Folio() {
	this.root = root = jQuery('body');
	this.folioWrap = root.find('.items');
	this.overflow_ = root.find('.detail-window');

	this.itemClick_ = function(evt){
		this.loadWork(url,750);
		return false;
	}

	this.loadWork = function(path,delay){
		this.overflow_.addClass("show");
		setTimeout(function() {
		folio.overflow_inner.html(" ").load(path, function() { 
		  folio.loading_.hide(); 
			folio.overflow_inner.addClass("show");
		  });
		}, delay);
	}
}
var folio = new Folio();

Проблема в методе loadWork .
не могу понять, почему в нем я не могу писать так:
this.loadWork = function(path,delay){
		this.overflow_.addClass("show");
		setTimeout(function() {
		this.overflow_inner.html(" ").load(path, function() { 
		  this.loading_.hide(); 
			this.overflow_inner.addClass("show");
		  });
		}, delay);
	}


Пока не смог понять в чем дело, но если написать вместо
this.overflow_inner
-
folio.overflow_inner
.
То всё работает. Кто-нибудь подскажите, я только недавно начал писать что-то на js. нагуглить не смог ничего.
setTimeout используется потому что нужно получить данные с задержкой.

danik.js 09.04.2013 09:25

Функция, переданная в качестве аргумента в setTimeout будет вызывана в контексте window, а не твоего инстанса (folio).
Скорее всего ты просто не понимаешь как работает this в javascript. Почитай об этом.
В ES5-совместимых браузерах контекст можно явно задать через .bind(context), в твоем случае это будет
setTimeout( (function(){ ... }).bind(this), delay)

Для старых браузеров либо подключать es5-shim.js либо оставить так, как у тебя, только объявлять folio внутри loadWork: var folio = this.

danik.js 09.04.2013 09:27

Цитата:

Сообщение от shumi
setTimeout используется потому что нужно получить данные с задержкой.

Зачем? Задержки никто не любит. Наша жизнь слишком коротка.

shumi 09.04.2013 09:53

Спасибо большое.
Я думал, что дело в контексте, но не знал как исправить это.

Задержка нужна для визуализации.
Во время работы скрипта идет анимация, и если ответ приходит слишком быстро, то анимация прерывается на самом, так сказать, интересном месте.

shumi 09.04.2013 10:01

Всё заработала - спасибо!


Часовой пояс GMT +3, время: 11:05.