0

思った通り、JSのスコープを理解した...

次のコードを使用します。

function init() {

    var page;
    var pageName = $('body').data('page');

    switch(pageName) {

        // (there are more switch cases here normally...)                   

        case 'pSearchLatest':
           require(['searchresults'], function (SearchResults) {
               page = new SearchResults().init();
               console.log(page); // <- shows the object!
           });

        default:
           break;

     }

     console.log(page); // <- undefined
     return page;

}

コンソール ログのコメントを参照してください。が switch ステートメントのスコープ外で宣言されているundefined場合、2 番目が返されるのはなぜですか?var page

編集

したがって、これはスコープの問題だと誤って考えていましたが、AMD の非同期性によるものです。

while ループで undefined をチェックせずに、同じメソッドの require スコープで page の値を返すにはどうすればよいですか?

編集2

私はこのようにしました:

function init(callback) {

   case 'pSearchLatest':
      require(['searchresults'], function (SearchResults) {
          page = new SearchResults().init();
          callback(page)
      });
}

そして、ラッピング init() メソッドを呼び出す私のページで:

new PageController().init(function(asyncViewController) {
   App.view = asyncViewController;
});
4

3 に答える 3

3

スコープを正しく理解しました。その内部関数のコードは、実際に外部スコープの変数に割り当てられます。

あなたが理解していなかったのは、非同期動作です。このrequire関数は、将来、要求されたモジュールが利用可能になったときに呼び出されるコールバック関数を受け取ります。console.logそれでも、それはすぐに戻り、制御フローはステートメントにつながります。これは、変数がその時点でundefined持っている値である出力を行います。page

が最初undefinedにログに記録され、(オブジェクトを使用して) コールバック内のログ ステートメントが後で実行されるため、それがコードの上にあることを認識できるはずです。

于 2013-06-05T18:42:24.780 に答える
2

requireは非同期であるため、関数は最初に終了し、次にコールバック関数を処理しました。

于 2013-06-05T18:43:16.950 に答える
1

考えられる理由は 2 つあります... ケースが一致しませんでした。または、値の割り当てがpage発生するコールバックがまだ実行されていません。caseあなたが失敗したかどうかはすぐにわかるので、後者だと思います。使用している AMD ライブラリのドキュメントを調べて、渡された関数の実行がどのように実行されるかを確認してくださいrequire

また、一般的なルールとして、このような非同期呼び出しによって決定された値を返すことは避けてください。代わりに、ある種の Observer パターンを使用して、さまざまな場所からトリガーできる特定のイベントをサブスクライブします。

于 2013-06-05T18:39:50.033 に答える