2017-09-28 20 views
1

私のページにはjavascriptを使って<div>要素をページに追加しています。内容と数は、サーバー上のフォルダの内容から得られます。ページにはいくつかの列があり、最小の列にそれぞれ新しいものを追加したいと思います。私はどの列が最小であるかを決定するためにこの関数を作成しました。 1回のリクエストで実行/テストすると、この機能は意図したとおりに機能します。私の "for-loop"の中の関数を、それを追加する必要がある要素とともに呼び出すと、無期限に実行されますか? forループのためのforループ内でJavascript関数が無限に実行される

「numberOfColumnsが添付番号とVARです*

function findSmallestColumn() { 
    var columns = document.getElementById("container").children; 
    var columnsHeight = []; 
    for (i = 0; i < numberOfColumns; i++) { 
     columnsHeight[i] = columns[i].offsetHeight; 
    } 
    var min = Math.min(...columnsHeight); 
    var minIndex = columnsHeight.indexOf(min) + 1; 
    return minIndex; 
} 

for(i = 0; i < importedElement.length; i++){} 

機能をです。

+3

あなたは 'i'の両方の定義に' var'(または 'let')を忘れてしまいました。 – thebjorn

答えて

3

あなたはあなたの内側に二forループを持っています関数は、iを無限に増加させます。ijまたは2つのいずれかの変数名に置き換えますforループと期待どおりに動作します。

キーワードletを使用してforループ内でローカルに宣言する場合は、同じ変数名iを使用できます。このキーワードは、現在のブロックでのみ変数を宣言します。

+2

なぜなら、JavaScriptの変数は関数にスコープされているからです。 forループは新しいスコープを提供しません。関数内で変数iを再宣言するとうまくいくはずです。 – 4thex

+0

ありがとうございます!今はっきりしていますが、私は何時間もこれを見ていませんでした。 –

+0

この質問は、常に[strictモード](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode)を使用するべきである理由の良い例です。忘れてしまった場合、変数を宣言し、その時間を節約します。リンターを使うことは、この種のバグにも大いに役立ちます。 –

関連する問題