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