2015-04-09 2 views
3

Я пытаюсь повторно использовать variable внутри function, который вызывает callback, но он не работает так, как мне кажется.Javascript: переменная область в обратном вызове

another()(); //=> logs "somevalue" 
callingfn(); //=> logs " someval is not defined" 

function a(fn){ 
    var someval = "some-value"; 
    return fn(); 
} 

function callingfn(){ 
return a.call(this, function(){ 
    console.log(someval) 
    }) 
} 

function another(){ 
    var sv = "somevalue"; 
    return function(){ 
    console.log(sv); 
    } 
} 

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

Где я ошибаюсь?

+0

'someval' является локальной по отношению к функции' а() 'и будет доступна только внутри' а() 'и любые замыкания внутри' а () '(в коде вы не указали). – techfoobar

+0

Uhm, справа. Мне было интересно, есть ли способ сделать обратный вызов закрытием в 'a()' – steo

+0

Это невозможно, так как это будет обратный вызов, он должен быть определен внутри 'a()' – techfoobar

ответ

1

Попробуйте:

another()(); //=> logs "somevalue" 
callingfn(); //=> logs " someval is not defined" 
var someval; 
var sv; 

function a(fn){ 
    someval = "some-value"; 
    return fn(); 
} 

function callingfn(){ 
return a.call(this, function(){ 
    console.log(someval) 
    }) 
} 

function another(){ 
sv = "somevalue"; 
    return function(){ 
    console.log(sv); 
    } 
} 
6

функция fn() отличается от a() хотя он получает fn в качестве параметра.

В качестве параметра вы можете отправить someval.

another()(); //=> logs "somevalue" 
callingfn(); //=> logs " someval is not defined" 

function a(fn){ 
    var someval = "some-value"; 
    return fn(someval); 
} 

function callingfn(){ 
return a.call(this, function(someval){ 
    console.log(someval) 
    }) 
} 

function another(){ 
    var sv = "somevalue"; 
    return function(){ 
    console.log(sv); 
    } 
} 

Или просто объявить var someval в глобальном масштабе, в настоящее время он находится внутри функции, которая делает его локальным.

Надеюсь, это поможет.

+0

@serenesat спасибо за основные моменты. .. –

1

someval Определить за рамки функций:

var someval; // <- outside of the scope of any one function 
another()(); //=> logs "somevalue" 
callingfn(); //=> logs " someval is not defined" 

function a(fn){ 
    someval = "some-value"; // <-remove "var" to access the variable outside the scope 
    return fn(); 
} 

function callingfn(){ 
return a.call(this, function(){ 
    console.log(someval) 
    }) 
} 

function another(){ 
    var sv = "somevalue"; 
    return function(){ 
    console.log(sv); 
    } 
} 
Смежные вопросы