Проблема с 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, время: 22:57. |