Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.02.2012, 01:12
Аспирант
Отправить личное сообщение для jsuse Посмотреть профиль Найти все сообщения от jsuse
 
Регистрация: 10.04.2010
Сообщений: 92

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

А почему к нему есть доступ в первом случае, не понимаю.
Ответить с цитированием
  #2 (permalink)  
Старый 13.02.2012, 01:17
Профессор
Посмотреть профиль Найти все сообщения от Mахmахmахimus
 
Регистрация: 10.02.2012
Сообщений: 254

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
}

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

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

Последний раз редактировалось Mахmахmахimus, 13.02.2012 в 01:29.
Ответить с цитированием
  #3 (permalink)  
Старый 13.02.2012, 01:21
Аспирант
Отправить личное сообщение для jsuse Посмотреть профиль Найти все сообщения от jsuse
 
Регистрация: 10.04.2010
Сообщений: 92

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

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

При втором вызове он выводит true. Мне не понятно, как это так легко rabbit.full можно обратиться свойству full. Оно же закрыто в функции. Он не должен его видеть этим вызовом. Оно же закрыто и доступно только, когда работает функция. А функция получается сработала rabbit.eat(), закрылась, а свойство почему-то видно. Хотя оно в объекте animal не определено, а определено только в функции.
Ответить с цитированием
  #4 (permalink)  
Старый 13.02.2012, 01:26
Аватар для poorking
prodigy
Отправить личное сообщение для poorking Посмотреть профиль Найти все сообщения от poorking
 
Регистрация: 01.11.2010
Сообщений: 503

this это не переменная, this указывает на контекст исполнения
__________________
readOnly
Ответить с цитированием
  #5 (permalink)  
Старый 13.02.2012, 01:26
Профессор
Посмотреть профиль Найти все сообщения от Mахmахmахimus
 
Регистрация: 10.02.2012
Сообщений: 254

Сообщение от jsuse
Хотя оно в объекте animal не определено, а определено только в функции.
функция создала там это свойство
Ответить с цитированием
  #6 (permalink)  
Старый 13.02.2012, 01:28
Аспирант
Отправить личное сообщение для jsuse Посмотреть профиль Найти все сообщения от jsuse
 
Регистрация: 10.04.2010
Сообщений: 92

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

Просто не дочитал, решил сразу спросить
Ответить с цитированием
  #7 (permalink)  
Старый 13.02.2012, 01:30
Профессор
Посмотреть профиль Найти все сообщения от Mахmахmахimus
 
Регистрация: 10.02.2012
Сообщений: 254

Сообщение от jsuse
Все, вопрос снимается.
А мой нет, что такое замыкание?
Ответить с цитированием
  #8 (permalink)  
Старый 13.02.2012, 01:35
Аспирант
Отправить личное сообщение для jsuse Посмотреть профиль Найти все сообщения от jsuse
 
Регистрация: 10.04.2010
Сообщений: 92

Сообщение от Mахmахmахimus Посмотреть сообщение

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

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

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

Кстати, всем спасибо за ответы, теперь понял.
Ответить с цитированием
  #9 (permalink)  
Старый 13.02.2012, 01:37
Профессор
Посмотреть профиль Найти все сообщения от Mахmахmахimus
 
Регистрация: 10.02.2012
Сообщений: 254

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

потому что бывает низсходящее замыкание бывает восходящее.)
ты описал только низсходящее.
Ответить с цитированием
  #10 (permalink)  
Старый 13.02.2012, 01:44
Аспирант
Отправить личное сообщение для jsuse Посмотреть профиль Найти все сообщения от jsuse
 
Регистрация: 10.04.2010
Сообщений: 92

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

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

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

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Свойства объекта, методы и this. Почему свойство вызывается с () ? jsuse Общие вопросы Javascript 2 04.11.2011 20:39
Prototype. Одноблочное определение псевдокласса. Литеральная форма не робит. Почему? GuardCat Общие вопросы Javascript 6 03.10.2011 13:46
Почему не определяется втарая переменная? Арман Общие вопросы Javascript 3 09.04.2011 11:14
Про замыкания Иваннн Общие вопросы Javascript 3 12.01.2011 11:12
Почему замыкания не работают? alex0071 Общие вопросы Javascript 2 18.08.2009 10:16