2016-06-10 3 views
-1

Вот пример закрытия из википедии articleПонимание основной пример закрытия из Википедии

function startAt(x) 
    function incrementBy(y) 
     return x + y 
    return incrementBy 

variable closure1 = startAt(1) 
variable closure2 = startAt(5) 

В соответствии со статьей

ссылающегося на closure1 (3) вернет 4, при вызове closure2 (3) вернется 8.

Что происходит за кулисами?

  1. Почему бы этот код не вызвать какую-либо ошибку на реальном языке программирования? incrementBy требует, чтобы вторая переменная делала сумму, не так ли?

  2. Когда мы вызываем clos() с аргументом, правильно ли мне присваивается значение y в пределах incrementBy scope?

  3. Я прав, что замыкание2 два привязано к записи, отличной от записи, к которой привязано замыкание1?

+0

Помогает ли этот пример: http://stackoverflow.com/questions/18234491/two-sets-of-parentheses-after-function-call/18234552#18234552? Пример закрытия JavaScript в значительной степени идентичен закрытию вашего вопроса. Помимо того факта, что внутренняя функция анонимна вместо имени 'incrementBy'. – Paulpro

+0

Вы также можете прочитать следующее: http://stackoverflow.com/questions/111102/how-do-javascript-closures-work. Я бы сказал, что это дубликат, за исключением того, что ваш вопрос кажется языковым агностиком. – Paulpro

ответ

0

Почему бы не этот код бросить какой-либо ошибки в реальном языке программирования? incrementBy требует, чтобы вторая переменная делала сумму, не так ли?

Зачем это ошибка? Да incrementBy использует две переменные x и y, но оба они определены. x было определено как 5, когда было вызвано startAt(5). y было определено как 3, когда было вызвано closure2(3).

Когда мы вызываем clos() с аргументом, правильно ли мне присваивается значение y в пределах incrementBy scope?

Да, вы правы, что в настоящее время подписан y в incrementBy, но обратите внимание, что существует множество функций, вызываемых incrementBy. Каждый создается каждый раз, когда вызывается startAt. В вашем коде есть две отдельные функции incrementBy, созданные двумя вызовами: startAt, каждый из которых имеет свой собственный контекст, который содержит свой собственный x в области.

Я прав, что замыкание2 два привязано к записи, отличной от записи, к которой привязано замыкание1?

Да, closure2 и closure1 являются две отдельные функции, которые обе копии incrementBy, но в разных контекстах.

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