Может кто-нибудь объяснить мне поток этой функции JavaScript? (Закрытие концепции)

Я читаю " Красноречивый JavaScript". Глава 3 знакомит с концепцией " Закрытие" и дает вам пару примеров. Один из них следующий:

function multiplier(factor) {
    return function(number) {
        return number * factor;
    };
}

var twice = multiplier(2);
console.log(twice(5));
// → 10

Я думаю, что понял концепцию. Если сначала я выполню console.log(twice), поскольку переменная number не определено, что я получаю [Function], Что я не понимаю, так это как twice(5) работает. Почему локальная переменная number инициализируется со значением 5?

Кроме того, почему, если я выполню console.log(multiplier(2,5)) Я не получаю 10 в результате?

Благодарю.

3 ответа

Решение

Так как multiplier возвращает функцию, так twice равно возвращаемой функции, а НЕ multiplier функция.

Однако когда multiplier называется factor переменная передается и используется в возвращаемой функции.

Чтобы было легче понять, учтите, что twice в основном:

var twice = function(number) {
    return number * 2;
};

куда factor было заменено значением, которое вы передали при вызове multiplier(2),


Я думаю, что понял концепцию. Если сначала я выполню console.log(twice), поскольку номер переменной не определен, то, что я получаю [Function],

Когда вы используете console.log(twice) вы на самом деле не вызываете функцию twiceВы просто регистрируете значение этого. Так что выход [Function] не потому что number не определено, это потому, что вы выводите реальную функцию, а не ее результат.


Кроме того, почему, если я выполню console.log(multiplier(2,5)) Я не получаю 10 в результате?

Здесь вы звоните multiplier предоставив 2 аргумента, хотя вы определили функцию для приема только одного параметра (factor). В javascript это не вызовет ошибку, но вы просто получите первое сопоставленное значение factor (factor = 2).

Примечание. Существуют способы получить доступ ко всем предоставленным аргументам, даже если для них не определены параметры ( вот пример)

То, что можно было бы получить в результате 10 что может представлять интерес - использовать следующий код:

var result = multiplier(2)(5); // result = 10

Множитель - это функция, которая возвращает анонимную функцию, которая принимает аргумент (число)

var twice = multiplier(2);

В основном это:-

 var twice = function(number) {
        return number * 2;
    };

Если вы выполните

console.log(multiplier(2,5))

Вы вызываете функцию, дающую два параметра, тогда как

function multiplier(factor) {}

принимает только один параметр.

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