Просмотр полной версии : Замыкания, осмысление!
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/docs/Web/JavaScript/Reference/Functions
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Functions
http://exploringjs.com/es6/ch_core-features.html
http://exploringjs.com/es6/ch_variables.html
Alexandroppolus
30.10.2018, 15:05
Эти функции делят одно определение тела функции, но сохраняют различные окружения.
думаю, определения функций тоже разные. По крайней мере это совершенно разные объекты (хотя возможно оптимизатор как-то расшаривает между ними некие внутренние структуры)
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
А мне думается, что функция одна, только окружения разные!Можете привести наглядный пример!?
А мне думается, что функция одна
Тогда должно выполняться равенство
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);
А оно не выполняется в твоем случае...
Можете привести наглядный пример!?
Так это же очевидно!
В твоем примере возвращается функция. Даже если текст у нее будет одинаковый - это таки разные объекты (читай функции). Про что тебе писали выше.
function test() {
return function() {
alert('Ok');
}
}
var fnc0 = test();
var fnc1 = test();
alert(fnc0===fnc1);
Т.ч. ты просто думаешь не верно.
Можете привести наглядный пример!?
Это все аксиомы из букваря
Два операнда-объекта строго равны, если являются ссылками на один и тот же общий объект
http://javascript.ru/comparison-operators
У тебя нет никакого равенства функций. Т.е. они равны только в твоем понимании и не более того.
Но ты же не JavaScript... ;) У языка свои правила.
AlexanderFilatov
01.11.2018, 13:44
Это все аксиомы из букваря
http://javascript.ru/comparison-operators
У тебя нет никакого равенства функций. Т.е. они равны только в твоем понимании и не более того.
Но ты же не JavaScript... ;) У языка свои правила.
Я понял, спасибо!Получается две разных функции.
vBulletin® v3.6.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot