2012-06-22 4 views
1

나는 이것을 보았다 : Returning values from nested functions in Javascript자바 스크립트 변수 범위 : 중첩 함수에서 변수를 반환 하시겠습니까?

그러나 그것은 정말로 나를 돕지 않았다 (또는 나는 그것을 얻는 데 너무 바보 같다).

내 변수 범위가 어떻게 든 꺼져 있고 그 이유를 알 수 없습니다. 내 알림()이 예상대로 작동하지 않습니다. 모든 줄에 의견을 추가하여 내가 생각하는 바를 설명하려고했습니다.

의견/포인터/답변 주셔서 감사합니다.

var g = {};/is a large object with all kinds of other stuff and functions in it 

g.ding = function(){ // my problem function 
var baby = 'young'; // i thought I set a local var here 
    if(someVar==true) { // standard issue if statement 
     someAPI.class(// using an API that uses a function as its attribute 
      function(stuff){ // my anonymous function 
       baby = 'old'; // setting the var to something 
      } 
     ); 
    } 
    return baby; // returning the var 
} 

alert(g.ding()); // i expect it to say "old" but it keeps saying "young". why? 

NEW EDIT : 후안의 허용 대답은 매우 중요하지만, 그들에게 동기 만드는 본질적으로 비동기 함수 호출을 처리하고 에서는 setTimeout()를 사용하는 방법도이 없다? 이걸 읽는 사람이 내가 알고 싶어하는 답을 알고 있다면. 감사.

+0

'function (stuff)'이 절대로 실행되지 않기 때문에 가능성이 큽니다. 귀하의 범위가 잘 보입니다. 여기에'baby = "old"를 설정하는 코드 행이 이제까지 실행된다는 것을 증명하는 것은 없습니다. 'someVar'는 거짓이거나'someAPI'는 함수를 호출 할 수 없습니다. –

+0

음, 원래이 함수가 호출되었다는 alert()을 확인했습니다. API 함수의 비동기 요소가 해결책이라고 생각합니다. – tim

답변

6

someAPI.class(function(){})에 대한 호출은 아마도 비동기식입니다. 즉, someAPI.class()이 반환되고 변수가 변경되지 않은 경우 전달한 함수가 호출되지 않았을 수 있습니다.

이 솔루션은 내가 (같은 클릭, 마우스 오버 등)

someAPI.class(); 

이벤트 관련 기능을해야한다고 생각 할 수있는 콜백 여기

g.ding = function(callback){ 
    var baby = 'young'; 
    if(someVar) { 
     someAPI.class(
      // There's no guarantee of when this function is called 
      function(stuff){ 
       baby = 'old'; 
       // Call the callback, it's like a return, for async functions 
       callback(baby); 
      } 
     ); 
    } 
    // the inner function probably wasn't called yet, 
    // doesn't make sense to return this here 
    // return baby; 
} 

// Then you'd call it like this, as soon as you use an async function 
// all the functions that call it have to use callbacks for return values 
g.ding(function(value){ 
    alert(value); 
}); 
+0

덕분에 후안, 이건 확실히 나를 위해 명확하게했다. 항상 비동기로 고생합니다. – tim

+0

@tim BTW,'class'는 예약어로 속성 이름으로 사용하면 안됩니다 (항상 someAPI [ "class"]()로 사용하지 않는 한) 메소드의 실제 이름이 아니길 바래요. 당신은 –

+0

Juan이라고 전화하고 있습니다. 감사합니다. 예, 'class'에 대해 알고 있습니다. 명확성을 위해 코드 샘플을 단순화했습니다. – tim

0

다시 변수를 전달하는 것입니다. 따라서 내부의 함수는 관련 이벤트가 발생할 때만 수행되므로 변수의 값을 변경합니다. 그러나 이벤트가 발생하지 않으므로 변수가 변경되지 않을 것이라고 생각합니다.

관련 문제