#javascript
#javascript
Вопрос:
Я читал книгу, когда увидел это
function multiplier(factor) {
return number => number * factor;
}
- Я знаю, что замыкания — это функции внутри функций, которые обращаются к локальным переменным родительской функции, но считается ли возвращаемая функция закрытием?
- Если это считается закрытием, это означает, что параметры также считаются локальными переменными. Это правда? Если да, то верно ли это для каждого языка программирования? Я видел несколько сообщений, в которых говорилось, что они не совсем одинаковые. В чем различия?
Комментарии:
1. 1. Да, у него есть свободная переменная с именем
factor
. 2. Да, параметры определяются функцией. Не обязательно, это верно для любого языка. С самого начала я не могу представить, как они будут отличаться во время выполнения (спецификация технически может указывать на некоторые различия, но необязательно, чтобы какие-либо из них наблюдались в пользовательской среде)
Ответ №1:
-
Хотя это правда, что это пример замыкания , это также пример функции curried .
-
Да, функция с ее параметрами и локальными переменными добавляется в стек вызовов, и это верно для (большинства?) Языков программирования. Я не знаю ни одного языка, где это не так, но можно было бы написать иначе, поэтому я уверен, что кто-то это сделал. Я бы сказал, что основное различие между параметрами / аргументами и локальными переменными заключается в том, что функция контролирует локальные переменные, тогда как параметры контролируются тем, что ее вызывает. Вы можете увидеть разницу здесь, но они более или менее одинаковы.
// You'll need to actually look in your dev tools to see the result
const test = test => test2 => test2;
console.log("Test:");
console.dir(test);
console.dir(test());
const best = function(best) {
return function(best2) {
return best2;
}
}
console.log("Best:");
console.dir(best);
console.dir(best());
// You'll need to actually look in your dev tools to see the result
Комментарии:
1. «пример каррирования функций» — каррирование — это процесс превращения функции из N аргументов в N функций с 1 аргументом. Это не «пример каррирования функции», а «пример каррированной функции» (разница имеет решающее значение: процесс против результата)
Ответ №2:
Вы задаете здесь более одного вопроса, но вопрос в названии заключается в том, являются ли параметры в javascript локальными для функции, в которой они используются. Ответ «да» плюс все вложенные функции.
Ответ №3:
Я беспокоюсь, что вы слишком серьезно относитесь к «закрытиям». Так называемое «замыкание» — это просто место, где существует область видимости / или граница этой области. фактор становится локальной переменной для этой функции… итак, это находится в области видимости этой функции… — и некоторым людям нравится использовать концептуальную модель, которую она закрывает вокруг этого … но — я видел, что эта ментальная модель приносит больше вреда, чем пользы. Функции имеют область видимости. Параметр / аргумент находится в области видимости этой функции. Иногда попытка назвать факт — это просто ненужная абстракция. Но если это работает для вас, то это тоже здорово. Просто не заставляйте его.
function multiplier(factor) {
// var factor = undefined; // is how you can think of it
// factor = incomingArgument
console.log('factor:', factor);
return function(number) {
// var number = undefined;
// number = incomingArgument
console.log('number:', number);
return number * factor;
// factor is coming from that outer scope only
}
}
var outer = multiplier;
var inner = multiplier(4);
var outcome = inner(5);
console.log('outer', outer);
console.log('inner', inner);
console.log('outcome', outcome);
от {
до }
будет областью действия.