1

何らかの理由で機能しない次のスクリプトがあります。

success: function( widget_data ) 
{ 

    if( widget_data.d[0] ) {

        var j = 0;

        for ( j = 0; j <= widget_data.d.length - 1; j++ ) {

            $.getScript( "js/" + widget_data.d[j].script, function() {

                // this line is complaining about .widget_id
                alert(widget_data.d[j].widget_id);
            });

            // but this line works fine...
            alert(widget_data.d[j].widget_id);

        }

    }

}

次の行でエラーが発生します。1つはwithing.getScriptです。

alert(widget_data.d[j].widget_id);

エラーメッセージは次のとおりです。

Cannot read property 'widget_id' of undefined

しかし、奇妙なことに、次のアラートは正常に機能し、正しい値を返します。

alert(widget_data.d[j].widget_id);

私は何が間違っているのですか?

4

1 に答える 1

4

getScript呼び出しは非同期で実行jされ、呼び出されたときの値ではなく変数をキャプチャします。これはj、呼び出しが戻ったときにループを終了した値を持っている可能性が高いことを意味します。関数内を呼び出して、参照ではなくgetScriptの値を取得できるようにする必要があります。j実際には、コードサンプルでわかるように、「ウィジェット」オブジェクト自体を実際にキャプチャする方がおそらく良いでしょう。

success: function( widget_data ) 
{ 

    if( widget_data.d[0] ) {

        var j = 0;

        for ( j = 0; j <= widget_data.d.length - 1; j++ ) {

            getWidgetScript( widget_data.d[j] );

            alert(widget_data.d[j].script);

            // but this line works fine...
            alert(widget_data.d[j].widget_id);
            alert(widget_data.d[j].title);

        }

    }

}

function getWidgetScript(widget) {
    $.getScript( "js/" + widget.script, function() {
        $( ".widget_header_" + widget.widget_id ).text( widget.title );
    });
}
于 2012-11-14T16:51:49.140 に答える