2015-10-08 1 views
0

У меня возникают проблемы в понимании вывод из приведенного ниже кода (в JavaScript):Почему функция, возвращаемая функцией обратного вызова, не образует замыкания над функцией, где она вызывается?

function outerFunction(callback){ 
    var x =10; 
    var myCallbackRet = callback(); 
    myCallbackRet();  
} 

outerFunction(function(){ 
    return function(){ 
    console.log(x); //output - x is not defined 
    } 
}); 

Насколько я понимаю, когда функция myCallbackRet называется то [[Scope]] свойство myCallbackRet устанавливается в Scope цепь outerFunction, и поэтому переменная x должна быть доступна внутри `myCallbackRet '.

Почему выходной параметр «undefined»? Заранее большое спасибо.

+1

Прежде всего 'вар myCallbackRet = обратный вызов()' 'должны быть вар myCallbackRet = обратный вызов,' – akinuri

+1

Нет, я думаю, что его право akinuri. Обратный вызов - это переданная функция, возвращающая функцию. – AtheistP3ace

+0

На самом деле я вызываю функцию обратного вызова и сохраняю результат обратного вызова, который сам является функцией внутри переменной myCallbackRet. Я считаю, что это совершенно верно. – Bauwa

ответ

2

Ваш анонимной функции function(){ return function(){ console.log(x) определяется на той же области (глобальном), как outerFunction, но х определяется внутри сферы outerFunction.

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

+0

Да, это правда. Я понимаю это. Но значение «myCallbackRet» - это функция, возвращаемая из анонимной функции. В качестве таковой она станет свойством объекта активации внешней функции с именем «myCallbackRet». Таким образом, он должен сформировать замыкание по внешней функции 'outerFunction' – Bauwa

+0

Я отредактировал ответ, чтобы включить объяснение в ваш комментарий @Bauwa – xiamx

+0

Спасибо большое. Я получаю его сейчас. Привет приветствует вас. – Bauwa

3

В основном это связано с тем, где определена ваша функция. Он был определен вне сферы действия. Закрытие работает только тогда, когда функция определена где-то. Установка переменной в функцию и ее вызов не делает все выше нее доступным внутри вызываемой функции или не будет причин передавать параметры функции. Что-то вроде этого будет работать.

function outerFunction(callback){ 
    var x =10; 
    var myCallbackRet = callback(); 
    myCallbackRet(x);  
} 

outerFunction(function(){ 
    return function(y){ 
     console.log(y); 
    } 
}); 

Или это:

function outerFunction(callback){ 
    var myCallbackRet = callback(); 
    myCallbackRet();  
} 

outerFunction(function(){ 
    var x =10; 
    return function(){ 
     console.log(x); 
    } 
}); 
+0

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

+0

Но как насчет функции, возвращаемой анонимной функцией? – Bauwa

+0

Я обновил свой ответ с более ясным объяснением и другим примером. – AtheistP3ace

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