Проблема с 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. Как она там доступна? |
Нет. parentEnable - это лишь ссылка на функцию, а функция та "находится" там где и была создана.
|
Ааа, ну тогда все становится понятно.
Aetae, спасибо за разъяснение. |
И тут я понял, что ничего не понял :D
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. |
Цитата:
Цитата:
|
Цитата:
|
Decode, вообще я думал что под "находится" вы понимаете scope. Но судя по всему это не так.
Тогда попробую разъяснить: функции(объекты и проч.) находятся исключительно в памяти и больше нигде. Всё остальное - ссылки. От того "места" где функция была создана зависят только переменные, что она на себя замыкает. |
Цитата:
Получается что... Блин, это пример вообще меня запутал. |
|
| Часовой пояс GMT +3, время: 09:09. |