Где параметр возвращаемой функции получает свое значение? - PullRequest
0 голосов
/ 26 апреля 2018

Я не знаю, выбрал ли я правильный заголовок для этого вопроса, и, возможно, именно поэтому я не могу также найти ответ на этот вопрос.

Читая книгу по javascript, я нашел этот пример, когда говорил о замыканиях.

function multiplier(factor){
    console.log('factor:'+factor);
    return function(number){
        console.log('number:'+number)
        return number * factor;
    };
}

var twice = multiplier(2);
console.log('twice:'+twice(5));

И в консоли я получаю этот вывод:

factor:2
number:5
twice:10

Я понимаю, что такое замыкание, но я не понимаю, как число переменной, которое, по моим сведениям, я ожидал равным undefined, получит значение 5.

Мои рассуждения таковы:

Когда я вызываю функцию multiplier(2) локальному переменному коэффициенту присваивается значение 2, поэтому первый вывод верен. Но когда он достигает линии return function(number){, ему присваивается номер undefined, поскольку для такого имени ранее не было назначено значение.

Так что он вообще вылетит и не будет правильно выводить, что получил.

Может кто-нибудь помочь мне понять, почему при вызове twice(5) он получает вывод number: 5

Спасибо всем, извините снова. Если я не правильно задал вопрос, не стесняйтесь изменить что-либо, чтобы сделать этот вопрос более понятным.

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Я думаю, что главное, что вы здесь упускаете, это то, что возвращаемая функция действует так же, как и любая другая функция. Функция не вводится, пока не будет вызвана.

return number * factor;

не запускается , пока вы не позвоните twice. Это так же, как

console.log('factor:'+factor);

не запускается , пока вы не позвоните multiplier. Тело функции не вводится, пока функция не будет вызвана. number не имеет значения до вызова twice, но код, который использует number, также не запускается до вызова twice.

0 голосов
/ 26 апреля 2018

Но когда он достигает функции возврата строки (число) {, ему присваивается номер undefined , поскольку для такого имени ранее не было назначено значение.

Вот недоразумение. Помните: в Javascript почти все является объектом. Некоторые скажут, что многие вещи, с которыми вы регулярно взаимодействуете (строки, числа, логические значения (обратите внимание, как я пишу эти буквы / примитивы / слова первой буквой в нижнем регистре. Я обычно использую прописные буквы для классов и строчные для примитивов)) являются примитивами, а не объектами , Это правда, но для целей этого потока давайте рассмотрим (почти) все объекты.

Давайте вернемся к этому предложению, которое вы написали:

когда он достигает функции возврата строки (число) { ему присваивается неопределенный номер

Вот в чем проблема: когда он достигает строки «return function (number) {}», он фактически возвращает функцию, которая является объектом.

Он не выполняет эту функцию, он только объявляет ее и возвращает как объект.

Вы могли бы написать «вернуть 666», он бы возвратил объект. Номер.

Давайте продолжим. Ваша переменная «дважды» теперь содержит функцию. Угадай, какой. Вот этот:

функция (число) { console.log ( 'номер:' + номер) номер возврата * коэффициент; }

Помните, вы объявили это и вернули его только в одном утверждении: "функция возврата (число) {...}"

Ваша переменная "double" теперь эквивалентна именованной функции, которую вы могли бы объявить следующим образом:

функция дважды (число) { console.log ( 'номер:' + номер) номер возврата * коэффициент; }

Да, функции - это Объекты, именованные функции похожи на именованные переменные, а переменные могут быть функциями.

Например, вы можете назвать это так: дважды (9) или так: дважды (5). Это то, что вы сделали.

Теперь давайте ответим на ваш вопрос:

почему дважды (5) он получает номер выхода: 5?

Потому что:

var double = function (number) { console.log ( 'номер:' + номер) номер возврата * коэффициент; }

И вы выполнили «дважды (5);» который в свою очередь выполнил console.log таким образом:

* * Console.log одна тысяча пятьдесят пять ( 'номер:' + 5); * +1056 *

Насколько я понял, в вашем "множителе функции ()" вы не хотите возвращать функцию, а скорее результат самой этой функции. Я советую вам прочитать о IIFE (выражение для немедленного вызова функции). С этим вы сможете, только в одном заявлении,: - объявить функцию - выполнить эту функцию - (и в итоге вернуть свой результат)

Получайте удовольствие, играя с Javascript. Javascript великолепен, только когда вы знаете, что происходит.

0 голосов
/ 26 апреля 2018

return function (number) { ... } возвращает функцию. number это не переменная, это параметр функции. Точно так же, как factor в function multiplier(factor) является параметром. Это не undefined и не приводит к сбою ничего.

По сути, multiplier(2) возвращает эту функцию:

function (number) {
    console.log('number:' + number)
    return number * 2;
}

... который вы присваиваете twice, поэтому twice теперь является вышеуказанной функцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...