4

次のjqueryコードがあります:

$.ajax({
    url: 'somefile.php',
    type: "POST",
    data: "",
    dataType: "json",
    async: false,
    success: function (data) {
                var var1  = something;
                var var2  = something;
                var var3  = something;
                var var4  = something;
                for (var i = 0; i < data.length; i++) {
                    $('.somediv').html('');
                    $('.somediv').append('Somehtml');
                }
                some_function_declared_later(var1, var2, var3, var4);
             }

コンパイル中にエラーが発生します: 'var1','var2','var3' & 'var4' are used out of scope. ただし、使用されているのと同じ関数で宣言されているため、問題はありません。

助けてください!

更新:これはsome_function_declared_later、現在の関数の外側の宣言と関係がありますか???

4

1 に答える 1

7

更新:あなたの質問の新しいバージョンはそれを完全に変更し、「コンパイラ」からのエラーを完全にナンセンスにします。引用した(更新された)コードから引用したエラーをツールが与えるとは信じがたいと思います。あなたは。

success質問のハンドラーの元のコードは次のようになります。

function (data) {
    for (var i = 0; i < data.length; i++) {
        var var1  = data[i][0];
        var var2  = data[i][1];
        var var3  = data[i][2];
        var var4  = data[i][3];
        $('.somediv').html('');
        $('.somediv').append('Somehtml');
    }
    some_function_declared_later(var1, var2, var3, var4);
 }

...そして、以下の答えはそのコードに関連しています。質問のコードの最新バージョンを使用してください。

元の答え:

問題の「コンパイラ」は「私のウェブホストから提供されたオンラインツール」であるとコメントで述べました。

おっしゃる通り、これらの変数スコープ内にあります。このツールは JavaScript を理解していないか、理解しています、言語よりも制限が厳しい「リント」処理を行っています。jslint、たとえば、そのようなエラーが表示されます(「ループ内で変数を宣言しないでください」)。(注意してください:jslint実際にはどのように行うべきかについての作成者の意見にすぎない多くの「エラー」が表示されます。) JavaScript では、varJavaScript には (現在) ブロック スコープがないため、 with で宣言された変数は関数全体で宣言されます。関数スコープとグローバルスコープのみ。ハンドラーsuccessコードは次のコードとまったく同じです。

function (data) {
    var var1, var2, var3, var4;
    for (var i = 0; i < data.length; i++) {
        var1  = data[i][0];
        var2  = data[i][1];
        var3  = data[i][2];
        var4  = data[i][3];
        $('.somediv').html('');
        $('.somediv').append('Somehtml');
    }
    some_function_declared_later(var1, var2, var3, var4);
 }

私のブログの詳細:悪い誤解var

さて、謎のコンパイラからのエラーがなくても、このコードはかなり奇妙に思えます。ループ内で変数を割り当てて再割り当てし、ループの外でそれらを使用しています。したがって、それらはundefined(if data.lengthis 0) またはループの最後のパスからの値のいずれかになります。


あなたの編集を再:

これは、現在の関数の外側の some_function_declared_later の宣言と関係があるのでしょうか?

いいえ。問題がそのsome_function_declared_laterコード行の時点で定義されていない場合、エラーはsome_function_declared_latervars ではなく について文句を言います。

関数宣言は、varステートメントと同様に、それらが表示されるスコープの先頭に持ち上げられます。したがって、これがさらに下にある場合:

function some_function_declared_later(a, b, c, d) {
    // ....
}

...大丈夫です(奇数ループ以外)。

これがさらに下にある場合:

var some_function_declared_later = function(a, b, c, d) {
    // ....
};

...その後some_function_declared_later、その上のコードのように宣言されます (ホイストされているため) が、関数をvarに割り当てるコード行の前にハンドラーが実行される場合var、値を持つ場合があります。(それはありそうにないようですが、念のため、そのようには書きません。)undefinedsuccesssome_function_declared_later

于 2013-10-18T07:00:15.143 に答える