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

#javascript

#javascript

Вопрос:

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

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

Комментарии:

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

Ответ №1:

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

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

 // 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);
  

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

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