2011-10-12 6 views
5

このdemoでは、私が(ラップなし)または(onLoad)を使用すると、私は異なる出力を得ました。wrap(head)vs onLoad

私の質問は、適切なアラートを得るために、htmlファイルに記載されています:1,2,3,4コードにはどのような変更が必要ですか?私はすべてのアラートで常に4まし道場の単純なロードで:

<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js"></script> 

<script type="text/javascript"> 
    var slider = []; 

    for (i = 0; i < 4; i++) { 

     slider[i] = function() { 

      alert([i]); 

     }; 
     dojo.addOnLoad(slider[i]); 
    } 
    </script> 

答えて

3

あなたはclosureを使用することができます。

var slider = []; 

for (i = 1; i < 5; i++) { 

    slider[i] = (function (i) { 

     return function() { alert([i]); } 

    })(i); 
    dojo.addOnLoad(slider[i]); 
} 

これは、状態を保存し、別の関数のスコープにiを保存します。閉鎖がなければ、iは元の関数にスコープされます。

+0

完璧な男、ありがとう – anvd

0

iの値は、それらが呼び出されたときに、あなたの関数が表示される内容である、ループの最後で4です。このような何か作業をする必要があります:

<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js"></script> 

<script type="text/javascript"> 
var slider = []; 

for (i = 0; i < 4; i++) { 
    eval("slider[i] = function() { alert([" + i + "]);};"); 
    dojo.addOnLoad(slider[i]); 
} 
</script> 

編集:それらが定義されているときの機能はなく、呼び出されたときだけでなく、あなたもカウントをやってみてください。例えば

<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js"></script> 

<script type="text/javascript"> 
var slider = []; 
var onLoadCounter = 0; 

var onLoadCallback = function() { 
    alert(onLoadCounter); 
    onLoadCounter++; 
}; 

for (i = 0; i < 4; i++) { 
    slider[i] = onLoadCallback; 
    dojo.addOnLoad(slider[i]); 
} 
</script> 
+0

これはユニークな選択肢ですか?もしそうなら、私は大きい評価を得るでしょう(より多くのコードがあります) – anvd

+2

'eval'を使わないでください。遅くてデバッグが難しい。 – Quentin