0

これは、クロージャーを使用して配列を更新する最良の方法ですか。これに似たものを別のサイトで見ました。作成されるグローバル変数について疑問に思っていclosure1ました。グローバルを作成せずにこれを行う方法はありますか。

<script>  
    var closure1=Closure(0, 0);

    function Closure(num, i) {
        var num=num;
        var index=i;
        var anArray = [];
        return function(num,index) {
          anArray[index]=(num);
          out.innerHTML=anArray;
        }
    } 
 </script>

<div id="d1" onclick=" closure1(2,0)">2 index 0</div>
<div id="d2" onclick=" closure1(5,3)">5 index 3</div>
<div id="d3" onclick=" closure1(4,1)">4 index 1</div>
<div id="d4" onclick=" closure1(9,7)">9 index 7</div>
<div id="out" >?</div>
4

2 に答える 2

0

onclick属性内で使用するには、作成したクロージャーを呼び出す方法が必要です。グローバル変数として持つことの利点はclosure1、クロージャが1回だけ作成され、を呼び出すだけでページ全体でそれを再利用できることclosure1(num, index)です。ただし、グローバルスコープで名前が付けられた変数を使用したくない場合は、次の方法でクリーンアップclosure1できます。

編集:私は以前に2つの提案された方法を投稿しました。方法の1つがOPのコードを壊すだろうと指摘してくれた@nnnnnnに感謝します。間違った提案を削除し、正しい提案をそのまま残しました。

既存の関数にプロパティとしてクロージャを追加できClosureます。たとえば、新しいクロージャーclosure1を作成する場合は、次のように作成する必要があります

次の行を削除します。

var closure1=Closure(0, 0);

次のように、関数が定義された後に次のを追加します。Closure

Closure.closure1 = Closure(0, 0);

onclicksを次のように置き換えます

<div id="d1" onclick="Closure.closure1(2,0)">2 index 0</div>

完全なコードは次のようになります。

<script>  
    function Closure(num, i) {
        var num=num;
        var index=i;
        var anArray = [];
        return function(num,index) {
          anArray[index]=(num);
          out.innerHTML=anArray;
        }
    } 

    Closure.closure1 = Closure(0, 0);
 </script>

<div id="d1" onclick="Closure.closure1(2,0)">2 index 0</div>
<div id="d2" onclick="Closure.closure1(5,3)">5 index 3</div>
<div id="d3" onclick="Closure.closure1(4,1)">4 index 1</div>
<div id="d4" onclick="Closure.closure1(9,7)">9 index 7</div>
<div id="out" >?</div>

これは私の意見では最もクリーンなアプローチです。お役に立てれば。

于 2013-03-05T06:07:20.200 に答える
0

このようなことができると思います。グローバル変数を作成したくない場合は、スクリプトを自己実行関数でラップします。

(function(){
      var closure1=Closure(0, 0);

      function Closure(num, i) {
        var num=num;
        var index=i;
        var anArray = [];
        return function(num,index) {
          anArray[index]=(num);
          out.innerHTML=anArray;
        }
      }
  }()); 
于 2013-03-05T06:02:06.443 に答える