2016-05-01 19 views
1

この質問には既に上記のリンクが付いています。しかし、私はすでにその答えを読んでおり、forループでsetIntervalを使う方法にしか答えていません。その解決策でパラメータが渡された関数が呼び出されず、それが私の状況なので、私の状況を修正するためには使用できませんでした。定義されていないパラメータを持つsetInterval関数の呼び出し

私はプログラミングが新しく、できる限り最善の方法で説明しようとしています。 setIntervalでは、setIntervalを呼び出す関数toggleClustersにパラメータを渡します。デバッガは、パラメータが正しいと表示します。マップマーカーオブジェクトを含むオブジェクトリテラルを保持する配列位置への参照です。デバッガは正しいオブジェクトリテラルがargとして渡されることを示しているので、setIntervalを使用するときに値が何であるかと何かを誤解しているように思えますが、関数が呼び出されると、デバッガはobjを表示します定義されていないとして渡されます。関数が呼び出されたときに渡された値が存在しなくなったのでしょうか?

function setClusterAnimations() { 
    for (var i = 0; i < clusters.length; i++) { 
     //intervalNames stores handle references for stopping any setInterval instances created 
     intervalNames.push(setInterval(function() { 
     //clusters[i] will hold an object literal containing marker objects  
     toggleClusters(clusters[i]); 
     }, 1000)); 
    } 
} 
//cObj is coming back as undefined in debugger and bombing 
function toggleClusters(cObj) { 
    var propCount = Object.keys(cObj).length; 
    for (var prop in cObj){ 
     if (prop.getZIndex() < 200 || prop.getZIndex() == 200 + propCount) { 
      prop.setZIndex(200); 
     } 
     else { 
      prop.setZindex(prop.getZIndex() + 1) 
     } 
    } 
} 
+0

質問:

は、コードの2次片の間の相違点を検討してください。参照した答えは、forループでsetIntervalを使用する方法を示しています。関数がパラメータで呼び出されている場合ではなく、関数実行時にそのパラメータがnullとして返されます。 – user192632

答えて

3

これは通常、setInterval()のような非同期呼び出しの問題です。

for (var i = 0; i < clusters.length; i++) { 
    //intervalNames stores handle references for stopping any setInterval instances created 
    intervalNames.push(setInterval(function (i) { 
    //clusters[i] will hold an object literal containing marker objects  
     toggleClusters(clusters[i]); 
    }.bind(null, i), 1000)); 
} 

toggleClusters(clusters[i])文は、あなたのループがiが正しい範囲を超えるだろう、その時点で終了したときに実行されます(それがclusters.lengthになります:あなたはの一つはbind()を使用して、さまざまな方法でこれを解決することができます)。 bind()で、大部分は関数パラメータiを使用して、コールバック関数のスコープに別の変数を作成します。この変数は、bind()を実行した時点で定義された値を取得します。それはiは元のiから独立しており、あなたが与えた値はbind()のままです。

+0

私は本当に答えに感謝します。あまりにも多くの人々が2つの文章を読んだ後、質問が重複していると判断します。明らかに私の問題は、forループを使用する方法ではなく、あなたが言ったように値を保持する方法です。私はそれを試してみましょう、それは動作するように見え、私は答えとしてマークします – user192632

+0

あなたは大歓迎です。 – trincot

1

これは、あなたの "i"変数が、setInvervalの引数として渡された関数に取り込まれていないためです。 したがって、この関数が呼び出されると、iは常にclusters.lengthに等しくなります。上記編集され

var arr = [1, 2, 3]; 

var broken = function() { 
    for(var i = 0; i < arr.length; ++i) { 
     setInterval(function() { 
     console.log("broken: " + arr[i]); 
     }, 1000); 
     // logs broken: undefined 
    } 
}; 

var fixed = function() { 
    for(var i = 0; i < arr.length; ++i) { 
    setInterval((function(k) { 
     return function() { 
     console.log("fixed: " + arr[k]); 
     } 
    }(i)), 1000); // i is captured here 
    } 
}; 
関連する問題