2

私はこれを見ました:Javascriptのネストされた関数からの値を返す

しかし、それは本当に私を助けませんでした(または私はそれを得るにはあまりにも愚かです)。

私の可変スコープはどういうわけかオフになっていて、その理由がわかりません。alert()が期待どおりに動作しません。私が考えていることを説明するために、すべての行にコメントを追加しようとしました。

コメント/ポインタ/回答をありがとうございました!

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?

新しい編集: Juanの受け入れられた答えは素晴らしいですが、setTimeout()を使用して非同期関数呼び出しを処理し、本質的にそれらを同期させる方法もありませんか?これを読んだ人が答えを知っているなら、私は知りたいです。ありがとう。

4

2 に答える 2

7

への呼び出しsomeAPI.class(function(){})はおそらく非同期です。つまり、渡した関数が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);
});
于 2012-06-22T04:33:36.407 に答える
0

ここで私はあなたのことを考えることができます

 someAPI.class();

イベント関連の機能 (クリック、マウスオーバーなど) である必要があります。したがって、その中の関数は、関連するイベントが発生したときにのみ実行され、変数の値が変更されます。しかし、イベントは発生しないため、変数は変化しないと思います。

于 2012-06-22T05:10:17.327 に答える