更新:あなたの質問の新しいバージョンはそれを完全に変更し、「コンパイラ」からのエラーを完全にナンセンスにします。引用した(更新された)コードから引用したエラーをツールが与えるとは信じがたいと思います。あなたは。
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 では、var
JavaScript には (現在) ブロック スコープがないため、 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.length
is 0
) またはループの最後のパスからの値のいずれかになります。
あなたの編集を再:
これは、現在の関数の外側の some_function_declared_later の宣言と関係があるのでしょうか?
いいえ。問題がそのsome_function_declared_later
コード行の時点で定義されていない場合、エラーはsome_function_declared_later
vars ではなく について文句を言います。
関数宣言は、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
、値を持つ場合があります。(それはありそうにないようですが、念のため、そのようには書きません。)undefined
success
some_function_declared_later