私は主に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.href
をthis.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を、」ログしかし、彼らは実際に正しい/期待されるナイーブ結果をログに記録するすべてのリンクをクリックする
http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-exampleの複製のように見える – elclanrs
関数がイベントハンドラとして使用されるとき、その 'this'が設定されますイベントが発生した要素に追加します(一部のブラウザでは、addEventListener以外のメソッドで動的に追加されたリスナーに対してこの規約に従わない場合があります)。 –
hmm @elclanrs問題はループとは関係ないが、内部関数にスコープのリークが関係していると言っていますか? –