Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Замыкания, осмысление! (https://javascript.ru/forum/misc/75690-zamykaniya-osmyslenie.html)

AlexanderFilatov 30.10.2018 09:55

Замыкания, осмысление!
 
Здравствуйте!Помогите разобраться правильно ли я понял замыкания!
Оцените кто-нибудь код:
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
- это 'Пока'.
Заранее спасибо всем за комментарии!

SuperZen 30.10.2018 10:27

Я нашел эти описания полезными, если понимать о чем там:
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

Alexandroppolus 30.10.2018 15:05

Цитата:

Сообщение от AlexanderFilatov
Эти функции делят одно определение тела функции, но сохраняют различные окружения.

думаю, определения функций тоже разные. По крайней мере это совершенно разные объекты (хотя возможно оптимизатор как-то расшаривает между ними некие внутренние структуры)

Dilettante_Pro 30.10.2018 15:48

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

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

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

новая функция будет как-то совмещаться с предыдущей

AlexanderFilatov 31.10.2018 08:55

А мне думается, что функция одна, только окружения разные!Можете привести наглядный пример!?

ksa 31.10.2018 09:30

Цитата:

Сообщение от 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);


Т.ч. ты просто думаешь не верно.

ksa 31.10.2018 09:44

Цитата:

Сообщение от AlexanderFilatov
Можете привести наглядный пример!?

Это все аксиомы из букваря
Цитата:

Два операнда-объекта строго равны, если являются ссылками на один и тот же общий объект
http://javascript.ru/comparison-operators

У тебя нет никакого равенства функций. Т.е. они равны только в твоем понимании и не более того.
Но ты же не JavaScript... ;) У языка свои правила.

AlexanderFilatov 01.11.2018 13:44

Цитата:

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

http://javascript.ru/comparison-operators

У тебя нет никакого равенства функций. Т.е. они равны только в твоем понимании и не более того.
Но ты же не JavaScript... ;) У языка свои правила.

Я понял, спасибо!Получается две разных функции.


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