Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 30.10.2018, 09:55
Интересующийся
Отправить личное сообщение для AlexanderFilatov Посмотреть профиль Найти все сообщения от AlexanderFilatov
 
Регистрация: 14.09.2018
Сообщений: 26

Замыкания, осмысление!
Здравствуйте!Помогите разобраться правильно ли я понял замыкания!
Оцените кто-нибудь код:
function makePhrase(phrase) {
    return function(name) {
        return phrase + ', ' + name;
    }
}
var phraseHi = makePhrase('Привет');
var phraseBye = makePhrase('Пока');
alert(phraseHi('Джек'));
alert(phraseBye('Джек'));

Мое понимание:
Функции phraseHi и phraseBye - это примеры замыканий!Эти функции делят одно определение тела функции, но сохраняют различные окружения.В окружении функции phraseHi аргумент phrase имеет значение 'Привет', а в окружении phraseBye phrase
- это 'Пока'.
Заранее спасибо всем за комментарии!
Ответить с цитированием
  #2 (permalink)  
Старый 30.10.2018, 10:27
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

Я нашел эти описания полезными, если понимать о чем там:
https://developer.mozilla.org/en-US/...ence/Functions
https://developer.mozilla.org/en-US/...uide/Functions

http://exploringjs.com/es6/ch_core-features.html
http://exploringjs.com/es6/ch_variables.html
Ответить с цитированием
  #3 (permalink)  
Старый 30.10.2018, 15:05
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,012

Сообщение от AlexanderFilatov
Эти функции делят одно определение тела функции, но сохраняют различные окружения.
думаю, определения функций тоже разные. По крайней мере это совершенно разные объекты (хотя возможно оптимизатор как-то расшаривает между ними некие внутренние структуры)
Ответить с цитированием
  #4 (permalink)  
Старый 30.10.2018, 15:48
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Если смотреть по складам, то, например,
var phraseHi = makePhrase('Привет');

соответствует
var phraseHi = function(name) {
        return 'Привет, ' + name;
    }

т.е. в этом случае создается отдельная функция, содержащая в себе Привет.
И вряд ли при последующем
var phraseBye = makePhrase('Пока');

новая функция будет как-то совмещаться с предыдущей
Ответить с цитированием
  #5 (permalink)  
Старый 31.10.2018, 08:55
Интересующийся
Отправить личное сообщение для AlexanderFilatov Посмотреть профиль Найти все сообщения от AlexanderFilatov
 
Регистрация: 14.09.2018
Сообщений: 26

А мне думается, что функция одна, только окружения разные!Можете привести наглядный пример!?
Ответить с цитированием
  #6 (permalink)  
Старый 31.10.2018, 09:30
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,206

Сообщение от AlexanderFilatov
А мне думается, что функция одна
Тогда должно выполняться равенство

function makePhrase(phrase) {
    return function(name) {
        return phrase + ', ' + name;
    }
}
var phraseHi = makePhrase;
var phraseBye = makePhrase;
alert(phraseHi===phraseBye);
phraseHi = makePhrase('Привет');
phraseBye = makePhrase('Пока');
alert(phraseHi===phraseBye);

А оно не выполняется в твоем случае...
Сообщение от AlexanderFilatov
Можете привести наглядный пример!?
Так это же очевидно!
В твоем примере возвращается функция. Даже если текст у нее будет одинаковый - это таки разные объекты (читай функции). Про что тебе писали выше.
function test() {
    return function() {
        alert('Ok');
    }
}
var fnc0 = test();
var fnc1 = test();
alert(fnc0===fnc1);


Т.ч. ты просто думаешь не верно.
Ответить с цитированием
  #7 (permalink)  
Старый 31.10.2018, 09:44
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,206

Сообщение от AlexanderFilatov
Можете привести наглядный пример!?
Это все аксиомы из букваря
Цитата:
Два операнда-объекта строго равны, если являются ссылками на один и тот же общий объект
http://javascript.ru/comparison-operators

У тебя нет никакого равенства функций. Т.е. они равны только в твоем понимании и не более того.
Но ты же не JavaScript... У языка свои правила.
Ответить с цитированием
  #8 (permalink)  
Старый 01.11.2018, 13:44
Интересующийся
Отправить личное сообщение для AlexanderFilatov Посмотреть профиль Найти все сообщения от AlexanderFilatov
 
Регистрация: 14.09.2018
Сообщений: 26

Сообщение от ksa Посмотреть сообщение
Это все аксиомы из букваря

http://javascript.ru/comparison-operators

У тебя нет никакого равенства функций. Т.е. они равны только в твоем понимании и не более того.
Но ты же не JavaScript... У языка свои правила.
Я понял, спасибо!Получается две разных функции.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пример из книги: замыкания ejik3800 Общие вопросы Javascript 1 01.04.2018 10:46
замыкания и утечки памяти newobject Общие вопросы Javascript 1 18.07.2014 12:39
замыкания, почему функция не видит переменные ruvi Общие вопросы Javascript 5 31.05.2014 17:36
Замыкания. Непонятная функция. PashPP Общие вопросы Javascript 3 06.09.2012 00:10
Про замыкания Иваннн Общие вопросы Javascript 3 12.01.2011 11:12