編集者は、この質問が JavaScript の範囲を理解するのに非常に役立つと感じたので、他の人に役立つことを願って、私自身の問題解決のアイデアを再度整理しました。
まずは面接の質問を見てみましょう:
var arr = [1, 2, 3]; for (var i = 0, j; j = arr[i++];) { console.log(j); } console.log('---------'); console.log(i); console.log('---------'); console.log(j); console.log('---------');
問題を解決する前に、まず JavaScript の変数フィールドに関連する知識を確認しましょう。
グローバル変数 (グローバル)
グローバル変数とは、どこからでもアクセスできる変数を指します。
var キーワードを使用するかどうかに関係なく、関数の外で宣言されています
var キーワードを使用せずに関数内で宣言します。当然、宣言されたステートメントは実行される必要があります
ローカル変数 (ローカル)
ローカル変数は、宣言された関数内でのみアクセスできます
関数内で宣言され、var キーワード
を使用します。
2つの注意点
まずコードを見てください:
alert(i); // 输出 undefined for (var i = 0; i < 1; i++){}; alert(i); // 输出1
JavaScript にはステートメントのスコープがありません。ステートメント内で定義された変数はステートメントの外側に広がります。この例では、i は for ステートメントの中で宣言されていますが、for ステートメントの外側でもアクセスできます。
i は for ステートメントの前でアクセスできますが、まだ割り当てられていません
問題解決を始めましょう
i++ は i が使用された後に追加されます:
初めて実行すると、j=arr[0]、次に i=1、console.log(j) は 1 を出力します
2 回目の実行では、j=arr[1]、次に i=2、ocnsole.log(j) は 2 を出力します
3 回目の実行では、j=arr[2]、次に i=3、ocnsole.log(j) は 3 を出力します
4 回目 (for 条件を満たさない)、j=arr[3] が未定義、その後 i=4、ocnsole.log(j) は出力がなく、for ループを終了します
for ステートメントの実行後、console.log(i) は上記の分析から 4 を出力し、console.log(j) は未定義を出力します
最終的な出力結果は次のとおりです:
2 --------- --------- undefined ---------
誰もが上記の分析と結果を理解したはずです。その後、推論を始めることができます。
質問を借用し、質問を 1 つ変更します
タイトル:
var arr = [1, 2, 3];
for (var i = 0, j; j = arr[++i];) { console.log(j); } console.log('---------'); console.log(i); console.log('---------'); console.log(j); console.log('---------');
答え:
2 3 --------- 3 --------- undefined ---------
質問を借用し、質問 2 を修正しました
タイトル:
function xxx() { var arr = [1, 2, 3]; for (var i = 0, j; j = arr[i++];) { console.log(j); } } xxx(); console.log('---------'); console.log(i); console.log('---------'); console.log(j); console.log('---------');
答え:
1 2 3 --------- 报错:Uncaught ReferenceError: i is not defined
これをあなたに共有します。JavaScript のスコープを理解するのに役立つことを願っています。