Eloquent Javascript, локальные переменные являются параметрами?

Я читал книгу, когда увидел это

function multiplier(factor) {
  return number => number * factor;
}
  1. Я знаю, что замыкания — это функции внутри функций, которые обращаются к локальным переменным родительской функции, но считается ли возвращаемая функция замыканием?
  2. Если это считается замыканием, это означает, что параметры также считаются локальными переменными. Это правда? Если да, то верно ли это для каждого языка программирования? Я видел несколько сообщений, в которых говорилось, что они не совсем одинаковы. Каковы различия?

1. Да, у него есть свободная переменная с именем factor. 2. Да, параметры ограничены функциями. Не обязательно, что верно для каждого языка. С самого начала я не могу придумать, как они будут отличаться во время выполнения (технически спецификация может указывать некоторые различия, но не обязательно, чтобы какие-либо из них наблюдались в пользовательской среде)

zerkms 10.04.2019 05:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
1
89
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы задаете здесь более одного вопроса, но вопрос в заголовке заключается в том, являются ли параметры в javascript локальными для функции, в которой они используются. Ответ - да плюс все вложенные функции.

Ответ принят как подходящий
  1. Хотя это и правда пример замыкания, это также пример каррированной функции.

  2. Да, функция со своими параметрами и локальными переменными добавляется в стек вызовов, и это верно для (большинства?) языков программирования. Я не знаю ни одного языка, на котором это было бы неверно, но на одном можно было бы написать иначе, так что я уверен, что кто-то это сделал. Я бы сказал, что основное различие между параметрами/аргументами и локальными переменными заключается в том, что функция контролирует локальные переменные, тогда как параметры контролируются тем, что ее вызывает. Вы можете увидеть разницу здесь, но они более или менее одинаковы.

// 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 аргументом. Это не "пример каррирования функции", а "пример каррирования функции" (разница принципиальная: процесс и результат)

zerkms 10.04.2019 08:57

Я беспокоюсь, что вы слишком серьезно относитесь к «закрытию». Так называемое "замыкание" - это просто место, где существует область/или граница этой области. 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);

от { до } будет областью действия.

https://jsfiddle.net/sheriffderek/z1juda8L/

Другие вопросы по теме