2015-12-28 3 views
-1

В Javascript функция обратного вызова всегда закрыта? Обратное не верно, как вы видите ниже [?]:Является ли функция обратного вызова всегда закрытием?

function makeFunc() { 
    var name = "Mozilla"; 
    function displayName() { 
    alert(name); 
    } 
    return displayName; 
}; 

var myFunc = makeFunc(); 
myFunc(); 

Где myfunc это замыкание, а не обратный вызов.

Закрытие - это функции, которые наследуют переменные из окружающей среды. Когда вы передаете обратный вызов функции в качестве аргумента другой функции, которая будет выполнять операции ввода-вывода, эта функция обратного вызова будет вызываться позже, и эта функция почти волшебным образом запомнит контекст, в котором он был объявлен , а также все переменные, доступные в этом контексте, и любые родительские контексты. Эта мощная функция находится в основе успеха Узла.

С другой link:

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

link

Когда мы передаем функцию обратного вызова в качестве аргумента другой функции обратного вызова выполняются в некоторой точке внутри тела объемлющей функции так же, как если обратный вызов был определенной в содержащей функцию. Это означает, что обратный вызов является закрытием . Прочитайте мой пост, Понимайте зашиты JavaScript с легкостью для подробнее о закрытии. Как известно, у закрытий есть доступ к области содержимого , поэтому функция обратного вызова может обращаться к содержащимся в ней функциям переменных и даже к переменным из глобальной области.

+2

'printLocation' не является закрытием в вашем примере. – Quentin

+5

Боюсь, неясно, о чем вы спрашиваете. – Louy

+2

Что вы думаете о закрытии? Вы спрашиваете: «При передаче литерала функции в функцию в качестве аргумента эта функция передается по ее несвободным переменным?» Это один из многих способов, которыми я мог бы проанализировать ваш вопрос. – apsillers

ответ

7

callback всегда закрытие?

Это ортогональные термины.

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

Закрытие всегда является внутренней функцией, которая использует переменные из внешней функции. Если внутренняя функция не использует внешние переменные, то она «ничего не закрывает» - просто функция как любая другая.

+0

Если обратный вызов использует переменные из внешней функции (окружающая среда), станет закрытием. Правильно? @ c-smile – carduh

+0

Обратный вызов - это просто ссылка на функцию. Эта функция может быть закрытием или нет - не имеет значения. Более того, имея функцию ссылки в JS, нет абсолютно никакого способа отличить функцию закрытия от любого другого. –

+0

Закрытие - это функции, которые наследуют переменные из окружающей среды. Когда вы передаете функцию обратного вызова в качестве аргумента другой функции, которая будет выполнять операции ввода-вывода, эта функция обратного вызова будет вызвана позже, и эта функция - почти волшебным образом - запомнит контекст, в котором он был объявлен, а также все доступные переменные в этом контексте и любых родительских контекстах. FROM: Professional Node.js Функция обратного вызова, переданная как аргумент, будет помнить контекст. Так что, если это произойдет, это закрытие? Функция обратного вызова стала Closure. Это то, что я хочу подтвердить @ c-smile – carduh

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