Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Почему this видно из замыкания? (https://javascript.ru/forum/misc/25698-pochemu-vidno-iz-zamykaniya.html)

jsuse 13.02.2012 01:12

Почему 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 там, выше в объекте;
  }
};

А почему к нему есть доступ в первом случае, не понимаю.

Mахmахmахimus 13.02.2012 01:17

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
}

функция добавила в обьект, новое свойство

Вопрос на миллион, что такое замыкание?

jsuse 13.02.2012 01:21

Цитата:

Сообщение от Mахmахmахimus (Сообщение 157046)
Простите, о ком идет речь?


Вот об этих вызовах в первом примере моей темы:
rabbit.eat()            // выводит "Я наелся"
alert(rabbit.full)      // выводит true

При втором вызове он выводит true. Мне не понятно, как это так легко rabbit.full можно обратиться свойству full. Оно же закрыто в функции. Он не должен его видеть этим вызовом. Оно же закрыто и доступно только, когда работает функция. А функция получается сработала rabbit.eat(), закрылась, а свойство почему-то видно. Хотя оно в объекте animal не определено, а определено только в функции.

poorking 13.02.2012 01:26

this это не переменная, this указывает на контекст исполнения

Mахmахmахimus 13.02.2012 01:26

Цитата:

Сообщение от jsuse
Хотя оно в объекте animal не определено, а определено только в функции.

функция создала там это свойство

jsuse 13.02.2012 01:28

Все, вопрос снимается. Там же, несколькими строками ниже дан и ответ:
Поэтому получается, что команда this.full = true устанавливает свойство full в самом объекте rabbit.

Просто не дочитал, решил сразу спросить :)

Mахmахmахimus 13.02.2012 01:30

Цитата:

Сообщение от jsuse
Все, вопрос снимается.

А мой нет, что такое замыкание?

jsuse 13.02.2012 01:35

Цитата:

Сообщение от Mахmахmахimus (Сообщение 157047)

функция добавила в обьект, новое свойство

Вопрос на миллион, что такое замыкание?


Еще не так основательно знаю замыкания, чтобы ответить прям готовым определением. Что-то типа, когда одна функция уже отработала и закрылась, но в другой, которая находилась в ней, сохраняются и доступны данные из той первой, закрывшейся. И этими данными можно манипулировать еще, хоть первая функция и закрылась. Правильно? :)

Кстати, всем спасибо за ответы, теперь понял.

Mахmахmахimus 13.02.2012 01:37

Цитата:

Сообщение от jsuse
Правильно

да, а если проще говорить, то это когда функция сохраняет свою область видимости))

потому что бывает низсходящее замыкание бывает восходящее.)
ты описал только низсходящее.

jsuse 13.02.2012 01:44

Цитата:

Сообщение от Mахmахmахimus (Сообщение 157060)
если проще говорить, то это когда функция сохраняет свою область видимости))


А какая сохраняет свою область видимости, отработавшая или та, что внутри?

Цитата:

потому что бывает низсходящее замыкание бывает восходящее.)
ты описал только низсходящее.

О, вот этого не знал. Буду теперь разбирать уже с этим знанием.


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