2016-07-24 3 views
1

私は主にPythonとClojureから来るjavascript/dom noobです。domの中のものを参照する意味は本当に混乱しています。dom要素をループするとき、 "this"を使うときと、いつループ変数を使うのか?

は、私はちょうどtestdownloadpageで定義された条件に一致するページのサブセットを識別し、それらを傍受し、こすりするPDFのダウンロードリンクにイベントリスナーがハングアップするChromeの拡張機能の中に書いたいくつかのコードから次の抽出物を取る:

function hanglisteners() { 
    if (testdownloadpage(url)) { 
     var links = document.getElementsByTagName("a"); 
     for (i = 0, len = links.length; i < len; i++) { 
      var l = links[i]; 
      if (testpdf(l.href)) { 
       l.addEventListener("click", function(e) { 
        e.preventDefault(); 
        e.stopPropagation(); 
        e.stopImmediatePropagation(); 
        getlink(this.href); 
       }, false); 
      }; 
     }; 
    }; 
}; 

元々、私はgetlink(l.href)の最後にgetlinkを呼び出していましたが、そのコードで起こることは、すべての一致するリンクをループし、getlinkという名前のリスナを叩くことになると思いましたそのリンクのURLにしかし、それはまったく機能しませんでした。私はl.hrefthis.hrefと置き換えようとしましたが、それは動作を開始しました。

l.hrefはなぜthis.hrefが働いたのか分かりません。私の最高の推測は、lが何か(?)に変更されたときに、ある時点後までaddEventListener呼び出しでjavascriptインタプリタがl.hrefを評価しないことです。しかし、私はなぜそれがすべきか、あるいはjavascriptが関数呼び出しの引数をいつ評価するかを知る方法がわからない...

そして今、私はより高いレベルの呼び出しを心配しているtestpdf(l.href)。この関数は、リスナーを掛ける前にリンクがpdfダウンロードリンクであることを確認するためにチェックされます。しかし、それはループ内でl.hrefを評価するため、各リンクを正しく評価する予定ですか?または、ループの後のある時点で評価するつもりですが、代わりにthis.hrefを使用する必要がありますか?

ループ変数を参照するか、またはthisが正しいかどうかを推測する必要がないように、何らかの魂が基本的な意味を私に説明してもらえますか?ありがとう!/ADDITION

EDIT:

コンセンサスは私の問題は、ループ内での内部関数は、スコープの犠牲者である(明らかによく知られている)の問題は、S。T.をリークしていることのようです呼び出されたときに、内部関数がすべての変数を使用して終了しない限り、ループの最後の要素にバインドされます。しかし、なぜこのコードはうまくいくのですか?

var links = document.getElementsByTagName("a"); 
 
for (i = 0, len = links.length; i < len; i++) { 
 
    let a = links[i]; 
 
    a.addEventListener("click", function(e) { 
 
    e.preventDefault(); 
 
    e.stopPropagation(); 
 
    e.stopImmediatePropagation(); 
 
    console.log(a.href); 
 
    }); 
 
};
<html> 
 
<head> 
 
    <title>silly test</title> 
 
</head> 
 
<body> 
 
    <p> 
 
    <a href="link1">Link 1</a> 
 
    <a href="link2">link2</a> 
 
    <a href="link3">link 3</a> 
 
    </p> 
 

 

 
</body> 
 
</html>

それらの回答に基づいて、私は...「リンク3を、」ログしかし、彼らは実際に正しい/期待されるナイーブ結果をログに記録するすべてのリンクをクリックする

+0

http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-exampleの複製のように見える – elclanrs

+0

関数がイベントハンドラとして使用されるとき、その 'this'が設定されますイベントが発生した要素に追加します(一部のブラウザでは、addEventListener以外のメソッドで動的に追加されたリスナーに対してこの規約に従わない場合があります)。 –

+0

hmm @elclanrs問題はループとは関係ないが、内部関数にスコープのリークが関係していると言っていますか? –

答えて

関連する問題