JavaScript変数のスコープに関するインタビューの問題

6531 ワード

ShinneJaieオリジナル、転載は出所を明記してください.
昨日の夜、ある交流グループの中で、あるネット友達が彼の面接問題を提出していました.ちょうど私も見ました.この問題について考えてみました.この問題はJavaScriptの役割領域を理解するのに役立つと思います.特にここで自分の問題を整理して、他の人に助けてもらいたいです.
まず次の問題を見ます.
 1     var arr = [1, 2, 3];  2     for (var i = 0, j; j = arr[i++];) {  3  console.log(j);  4  }  5 
 6     console.log('---------');  7  console.log(i);  8     console.log('---------');  9  console.log(j); 10     console.log('---------');
 
問題を解く前に、まずJavaScriptの変数領域に関する知識を振り返ってみます.
グローバル変数(Global)
グローバル変数とは、どこでもアクセスできる変数のことで、2つの場合があります.
  • functionの外で宣言します. var キーワード
  • functionでは、使用しません. var キーワードはもちろん、ステートメントのステートメントが実行されなければなりません.
    ローカル変数(Local) ) 
    ローカル変数は宣言されたfunctionの内部にのみアクセスできます.
  • functionで宣言し、使用する. var キーワード
  • 2時の注意点
    コードを先に見ます
    1 alert(i); //    undefined
    2 
    3 for (var i = 0; i < 1; i++){};
    4 
    5 alert(i); //   1
  • JavaScriptは文の作用領域が存在しません.文の中で定義された変数は文の外に拡散します.例のiはfor文で宣言しますが、for文の外ではそのまま
  • にアクセスできます.
  • は、for文の前にiにアクセスできますが、まだ
  • に割り当てられていません.
    私たちの問題を始めます.
    i++はiを使用した後、追加されます.
    初めて実行した場合は、j=arr[0]、その後i=1、consolue.log(j)が1を出力します. 
    2回目の実行時は、j=arr[1],その後i=2,ocnsole.log(j)出力2
    3回目の実行時は、j=arr[2],その後i=3,ocnsole.log(j)出力3
    第四回(該当しないfor) 条件)、j=arr[3]はundefinedで、その後i=4、ocnsole.log(j)は出力されず、forサイクルを終了します.
    for文の実行が完了したら、consolie.logl(i)は上の分析で出力4、consolie.logl(j)はundefinedを出力します.
    最後の出力結果は:
    1
    2
    3
    ---------
    4
    ---------
    undefined
    ---------
    上の分析と結果については、皆さんはもう分かりましたよね.
    問題を借りて題を直す
    タイトル:
     1     var arr = [1, 2, 3];  2     for (var i = 0, j; j = arr[++i];) {  3  console.log(j);  4  }  5 
     6     console.log('---------');  7  console.log(i);  8     console.log('---------');  9  console.log(j); 10     console.log('---------');
    答え:
    1 2 2 3 3 --------- 4 3 5 --------- 6 undefined 7 ---------
    問題を借りて2題を直す
    タイトル:
     1     function xxx() {  2         var arr = [1, 2, 3];  3         for (var i = 0, j; j = arr[i++];) {  4  console.log(j);  5  }  6  }  7  xxx();  8 
     9     console.log('---------'); 10  console.log(i); 11     console.log('---------'); 12  console.log(j); 13     console.log('---------');
    答え:
    1
    2
    3
    ---------   :Uncaught ReferenceError: i is not defined