Почему this видно из замыкания?
Помогите разобраться с this. Подскажите, где неправильно думаю.
Вот есть пример в учебнике, тема "Прототипное наследование". var animal = { eat: function() { alert( "Я наелся" ); this.full = true; } }; var rabbit = { jump: function() { /* ... */ } } rabbit.__proto__ = animal rabbit.eat() // выводит "Я наелся" alert(rabbit.full) // выводит true Интересует, как он может видеть true, когда обращаешься rabbit.full? Почему к свойству full так можно обратиться, если оно находится в функции и по идее оно в замыкании. Его не должно быть видно. Я понимаю, если бы было так: var animal = { full: false, // вот так оно находится в локальной области объекта eat: function() { alert( "Я наелся" ); this.full = true; // и после срабатывания ф-ции оно бы становилось true там, выше в объекте; } }; А почему к нему есть доступ в первом случае, не понимаю. |
var animal = { eat: function() { this.full = true; } }; rabbit.eat() rabbit.eat() вызывается функция eat! this'ом в ней будет тот обьект который первый слева после точки, либо если слева точки нет, то window. то есть в нашем случае this'ом будет rabbit. В функции одно действие оно обращается к этому обьекту через this (то есть к кролику) и создает в нем свойство full и засовывает в него значение true. был обьект animal { eat : function } стал обьект animal { eat : function, full : true } функция добавила в обьект, новое свойство Вопрос на миллион, что такое замыкание? |
Цитата:
Вот об этих вызовах в первом примере моей темы: rabbit.eat() // выводит "Я наелся" alert(rabbit.full) // выводит true При втором вызове он выводит true. Мне не понятно, как это так легко rabbit.full можно обратиться свойству full. Оно же закрыто в функции. Он не должен его видеть этим вызовом. Оно же закрыто и доступно только, когда работает функция. А функция получается сработала rabbit.eat(), закрылась, а свойство почему-то видно. Хотя оно в объекте animal не определено, а определено только в функции. |
this это не переменная, this указывает на контекст исполнения
|
Цитата:
|
Все, вопрос снимается. Там же, несколькими строками ниже дан и ответ:
Поэтому получается, что команда this.full = true устанавливает свойство full в самом объекте rabbit. Просто не дочитал, решил сразу спросить :) |
Цитата:
|
Цитата:
Еще не так основательно знаю замыкания, чтобы ответить прям готовым определением. Что-то типа, когда одна функция уже отработала и закрылась, но в другой, которая находилась в ней, сохраняются и доступны данные из той первой, закрывшейся. И этими данными можно манипулировать еще, хоть первая функция и закрылась. Правильно? :) Кстати, всем спасибо за ответы, теперь понял. |
Цитата:
потому что бывает низсходящее замыкание бывает восходящее.) ты описал только низсходящее. |
Цитата:
А какая сохраняет свою область видимости, отработавшая или та, что внутри? Цитата:
О, вот этого не знал. Буду теперь разбирать уже с этим знанием. |
Часовой пояс GMT +3, время: 19:24. |