Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 31.01.2015, 19:44
Профессор
Отправить личное сообщение для Decode Посмотреть профиль Найти все сообщения от Decode
 
Регистрация: 31.01.2015
Сообщений: 576

Проблема с this
Приветствую. Прошу помочь разобраться с работой данного кода:

function Machine() {
	this._enabled = false;
	var self = this; // ссылка на объект создаваемый CoffeeMachine

	this.enable = function() {
		// внешняя переменная вместо this
		self._enabled = true;
	};

	this.disable = function() {
		this._enabled = false;
	};
}

function CoffeeMachine() {
	Machine.apply(this, arguments);

	var parentEnable = this.enable;
	this.enable = function() {
		parentEnable();
		/// this.run(); и другие методы
	}
}
var coffeeMachine = new CoffeeMachine();
coffeeMachine.enable();

В переменную parentEnable копируется эта функция:
function() {
   self._enabled = true;
};

Когда происходит вызов coffeeMachine.enable() — будет запущена функция parentEnable. Меня вводит в заблуждение переменная self внутри нее. Она ведь локальная переменная другой функции. Внутри функции Machine она доступна через замыкание. Но parentEnable находится внутри конструктора CoffeeMachine. Как она там доступна?
Ответить с цитированием
  #2 (permalink)  
Старый 31.01.2015, 20:24
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Нет. parentEnable - это лишь ссылка на функцию, а функция та "находится" там где и была создана.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 31.01.2015, 22:16
Профессор
Отправить личное сообщение для Decode Посмотреть профиль Найти все сообщения от Decode
 
Регистрация: 31.01.2015
Сообщений: 576

Ааа, ну тогда все становится понятно.

Aetae, спасибо за разъяснение.
Ответить с цитированием
  #4 (permalink)  
Старый 09.02.2015, 17:43
Профессор
Отправить личное сообщение для Decode Посмотреть профиль Найти все сообщения от Decode
 
Регистрация: 31.01.2015
Сообщений: 576

И тут я понял, что ничего не понял

function Machine() {
	this._enabled = false;
	var self = this; // ссылка на объект создаваемый CoffeeMachine

	this.enable = function() {
		// внешняя переменная вместо this
		self._enabled = true;
	};

	this.disable = function() {
		this._enabled = false;
	};
}

function CoffeeMachine() {
// при запуске new CoffeeMachine создается новый объект {}
	Machine.apply(this, arguments); // происходит вызов в контексте этого объекта
// Функция Machine вписывает в него свои св-ва и методы: _enabled, enable, disable
	var parentEnable = this.enable; // ссылка на функцию объявленную в Machine? Или ссылка на функцию которую Machine вписал в создаваемый объект?
	this.enable = function() { // переопределение оригинального метода
		parentEnable();
		/// this.run(); и другие методы
	}
}
var coffeeMachine = new CoffeeMachine();
coffeeMachine.enable();




Почему parentEnable в замыкании понятно. Почему функция Machine оказалась там? Ведь она же просто вызвана, но не объявлена в CoffeMachine.
Ответить с цитированием
  #5 (permalink)  
Старый 09.02.2015, 17:57
Профессор
Отправить личное сообщение для jsnb Посмотреть профиль Найти все сообщения от jsnb
 
Регистрация: 15.03.2014
Сообщений: 561

Сообщение от Decode
Почему функция Machine оказалась там?
Где там? Я вижу вызов функции Machine внутри CoffeeMachine и ничего необычного в этом нет т.к. Machine определена в области видимости выше.

Сообщение от Decode
ссылка на функцию объявленную в Machine? Или ссылка на функцию которую Machine вписал в создаваемый объект?
Второе. Machine вписывает новую функцию enable в каждый инстанс.
Ответить с цитированием
  #6 (permalink)  
Старый 09.02.2015, 18:10
Профессор
Отправить личное сообщение для Decode Посмотреть профиль Найти все сообщения от Decode
 
Регистрация: 31.01.2015
Сообщений: 576

Сообщение от jsnb Посмотреть сообщение
Где там? Я вижу вызов функции Machine внутри CoffeeMachine и ничего необычного в этом нет т.к. Machine определена в области видимости выше.
На скрине. Там два Closure, это ведь замыкание? Там parentEnable и Machine.
Ответить с цитированием
  #7 (permalink)  
Старый 09.02.2015, 19:35
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Decode, вообще я думал что под "находится" вы понимаете scope. Но судя по всему это не так.
Тогда попробую разъяснить: функции(объекты и проч.) находятся исключительно в памяти и больше нигде. Всё остальное - ссылки. От того "места" где функция была создана зависят только переменные, что она на себя замыкает.
__________________
29375, 35
Ответить с цитированием
  #8 (permalink)  
Старый 10.02.2015, 03:26
Профессор
Отправить личное сообщение для Decode Посмотреть профиль Найти все сообщения от Decode
 
Регистрация: 31.01.2015
Сообщений: 576

Сообщение от Aetae Посмотреть сообщение
[b]функции(объекты и проч.) находятся исключительно в памяти и больше нигде.
Это я понял.

Получается что... Блин, это пример вообще меня запутал.
Ответить с цитированием
  #9 (permalink)  
Старый 10.02.2015, 15:55
Профессор
Отправить личное сообщение для Decode Посмотреть профиль Найти все сообщения от Decode
 
Регистрация: 31.01.2015
Сообщений: 576

Aetae, я верно изобразил схему?

http://jsfiddle.net/fk6q6ad8/

Последний раз редактировалось Decode, 11.02.2015 в 20:39.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с радио кнопками px379 Общие вопросы Javascript 8 29.07.2013 09:30
Проблема с обработкой ескольких .hover() anocean jQuery 3 15.06.2012 22:43
Проблема с Popup окном vovuslik jQuery 5 12.06.2010 16:12
Проблема с CSS COKOJIOB (X)HTML/CSS 5 04.08.2009 14:19
Проблема, в менюшке Большой джо Элементы интерфейса 0 12.07.2009 17:12