2017-01-01 7 views
0

следующий код не работает:JavaScript Closure - помочь мне понять, почему возвращаемое значение внутренней функции в не возвращает

function addToAnswer(param){ 
    var answer = 10; 
    function adder(){ 
    return answer + param; 
    }; 
    adder(); 
} 
console.log(addToAnswer(5)); // returns undefined, expecting 15 

Исправление для этого кода return adder(); я чувствую себя довольно глупо, что мне, addToAnswer() должен возвращать значение от adder() функция. Как бы вы ответили, если его спросили, почему он не работает?

+2

'addToAnswer' не имеет' return' заявление, поэтому она возвращает 'undefined'. – Barmar

+0

Боковое примечание: объявления функций не принимают ';' в конце, ';' после того, как объявление функции 'adder' является посторонним (но безвредным). –

ответ

2

Как бы вы ответили, если его спросили, почему он не работает?

Я бы сказал, что в JavaScript функции, как правило, не возвращают значение, если вы не явно использование return сделать это. (Есть языки, где они работают, в частности, CoffeeScript, но не JavaScript.)

Единственным исключением является точная функция стрелки , которая неявно возвращает результат одного выражения, которое разрешено содержать.

Вот пример краткой функции стрелки используются:

someArray.sort((a, b) => a - b); 
//    ^^^^^^^^^^^^^^^---- concise arrow function 

Но это единственное исключение. Подробные функции стрелок, function функции и методы требуют наличия явноreturn. Если путь кода, полученный через функцию, не достигает явного return со значением, результатом вызова функции является значение undefined.


(Некоторые могут возразить, что конструктор функции являются вторым исключением из этого правила, потому что, когда вы делаете new Thingy результат является новым штуковина, даже если Thingy не имеет возвращаемого значения, но это не так . в этом случае, это new выражение что имеет результат, а не о том, что конструктор возвращает ничего неявно. И в самом деле, различие четко рисуются в спецификации.)

2

Если функция не выполняет return заявления , он возвращает undefined. Он автоматически не возвращает значение последней строки в функции. Поэтому, когда вы пишете:

adder(); 

в конце функции, он вызывает adder(), который возвращает 15. Затем addToAnswer отбрасывает это значение и возвращает undefined.

1

Для этого вам необходимо понять, как работает возврат.

Когда вы вызываете add(); элемент управления переходит к началу функции добавления, и когда внутри он достигает оператора return, элемент управления возвращается к точке, где была вызвана функция добавления, вместе с любым значением, если она обрабатывается, и продолжается с остальной частью кода.

Поскольку функция addToAnswer не указана для возврата значения, следовательно, она обрабатывает код (вычисляет параметр + ответ), но ничего не возвращает, поэтому значение этой функции не определено.

Для экспериментов вы можете удалить ключевое слово return из внутренней функции, а вместо этого - return adder();. Вы получите undefined, потому что, несмотря на то, что функция сумматора обработала код, так как он не запрашивал явно вернуть значение, это не так.

1

Когда функция adder() возвращается, она выводит только текущий контекст выполнения и возвращается к нижнему слою - addToAnswer(). Вам нужно понять, как работает стек выполнения:
1. Когда файл запускается впервые, создается глобальный контекст выполнения.
2. Все значения, не определенные в рамках другой функции, добавляются в глобальный контекст выполнения.
3. При запуске первой функции создается новый контекст выполнения.
4. Этот новый контекст выполнения способен ссылаться на переменные и функции, определенные в любом родительском контексте, ниже его в стеке, в данном случае - глобальном контексте выполнения.
5. Наконец, третий контекст выполнения выставляется в стек для любых функций, определенных в функции addToAnswer().
enter image description here

http://davidshariff.com/blog/what-is-the-execution-context-in-javascript/ https://simpleprogrammer.com/2016/06/06/javascript-execution-stack-key-learning-language/

 Смежные вопросы

  • Нет связанных вопросов^_^