2016-09-08 4 views
-1

JSHintと私のコードをリンティングした後、それは以下のようなループのために新しい関数を作成しないように助言を思い付いた:クロージャ - javascriptの

for (var i = 0; i < AnArray.length; i++){ 
    // code that creates an element 
    (function(_i) { 
     element.addEventListener(
      "click", 
      function() { DoSomething(_i); } 
     ); 
    })(i); 
} 

のdoSomething(引数)そのArrayエンティティに関連する何かをします。私は運がないと、以下のようなコードを試してみました。

function RegisterClick (elem, i) { 
    elem.addEventListener(
     "click", 
     function() { DoSomething(_i) } 
    ) 
} 

for (var i = 0; i < AnArray.length; i++){ 
    // code that creates an element 
    (RegisterClick (_elem, _i)) (element, i); 
} 
  1. これは私が長期的には心配すべきものですか?
  2. 新しい機能を作成せずにクロージャの利点を得る方法はありますか?
+0

* "forループで新しい関数を作成しないように注意していました" *しかし、IIFEを使用してJSHintが警告する問題を回避しているので、うまくいくでしょう。 *「私は運がない、以下のようなコードを試しました」*正確にはどういう意味ですか? * "新しい関数を作成せずにクロージャの利点を得る方法はありますか?" *クロージャは関数です。機能がなければクロージャはありません。 –

答えて

2

私は以下のようなコードを試してみましたが、運がありません。

あなたのコードをよく考えています。あまりにも多くのかっこがあります。あなたは関数を呼び出す必要があります。戻り値はundefinedです。呼び出す必要はありません。変数名もまっすぐに保つ必要があります。

function register_click(elem, i) { 
    elem.addEventListener(
     "click", 
     function() { DoSomething(i) } 
    ); 
} 

var _elem = something_that_gets_an_element(); 

for (var i = 0; i < an_array.length; i++){ 
    register_click(_elem, an_array[i]); 
} 

これは私が長期的には心配すべきものですか?

機能を別々に作成すると、読みやすいコードが明確になります。ネストしたスコープの数が少ないので、どの変数がどのスコープであるかを把握するのが簡単です。

新しい機能を作成せずにクロージャの利点を得る方法はありますか?

at the end of this answerのようにletを探している可能性があります。

関連する問題