1

第6章

私は英語が下手で問題を詳しく説明できないので、練習コードを貼り付けます: http://jsbin.com/exusox/3/edit

ボタンをクリックすると無限ループします。

コードをテストしたところ、このコードで無限ループが見つかりました:

function extractFootnotes(paragraphs){
    var footnotes=[],currentNum=0;
    function dealWithFootnote(fragment){
      if(fragment.type=="footnote"){
        currentNum++;
        fragment.number=currentNum;
        footnotes.push(fragment);
        return {type:"reference",number:currentNum};
      }
      else{
        return fragment;
      }
    }
    //run here ,endless loop happened.I've tested forEach,the i++ can't work.
    forEach(paragraphs,function(paragraph){
      paragraph.content=map(dealWithFootnote,paragraph.content);
    });

    return footnotes;
  }


  function forEach(array,action){
    for(i=0;i<array.length;i++)
      action(array[i]);
  }

  function map(func,array){
    var result=[];
    forEach(array,function(element){
      result.push(func(element));
    });
    return result;
  }

なぜこれが起こるのか、どうすればコードを減らすことができますか?ありがとう。

私の実践規範

4

1 に答える 1

1

「forEach」関数の変数「i」はグローバル変数です。次のように宣言する必要がありますvar

function forEach(array, action) {
  var i;
  // ... etc
}

したがって、「forEach」への 1 回の呼び出しで、それ自体が「forEach」を呼び出すアクションが含まれる場合、同じ変数「i」がリセットされます。

これをコードの先頭に置くことをお勧めします。

"use strict";

これは、インタープリターに新しいルールをコードに適用するように指示し、そのようなエラーを表示します。

于 2013-01-23T17:57:58.040 に答える