2016-10-24 8 views
2

私はボタンのシングルユースイベントリスナーを登録すると仮定し、私は書くことができます:内から関数オブジェクトにアクセスするには?

var someButton; 
var once = function() { 
    console.log("clicked"); 
    someButton.removeEventListener("click", once); 
}; 
someButton.addEventListener("click", once); 

私は何をしてもその関数に名前を付けたくない場合は? Like:

var someButton; 
someButton.addEventListener("click", function() { 
    console.log("clicked"); 
    someButton.removeEventListener("click", /* what goes here? */); 
}); 
+0

まさに!これは(他の理由の中でも)ハンドラとして名前付きの関数を提供することが最善の理由です。 – gkb

答えて

5

名前を付ける必要があります。しかし、あなたは名前付きの関数式を使うことができます。

someButton.addEventListener("click", function foo() { 
    console.log("clicked"); 
    someButton.removeEventListener("click", foo); 
}); 

スコープ内になるので、関数内からのみアクセスできます。

また

、addEventListenerをのための新しい(非常に新しい、執筆時点ではクロム55またはFirefox 50、無MSIE、オペラや安定したSafariのサポートが必要)オプションの構文を使用します。

someButton.addEventListener("click", function() { 
    console.log("clicked"); 
}, { once: true }); 
3

あなたははをを作成していないこと

var someButton; 
someButton.addEventListener("click", function handler() { 
    console.log("clicked"); 
    someButton.removeEventListener("click", handler); 
}); 

:機能をどこでその中を除く範囲にない名前を付けることができますスコープ内の識別子バインディングはsomeButtonです。 (ヒストリカルノート:IE8以前のバージョンでは、バグがありました)

本当にやりたくない場合、ゆるやかなモードを使用したり、廃止予定のものを使用しても構わない場合は、arguments.callee代わりに:私もその関数に名前を付けたくない場合はどう

// NOT RECOMMENDED AT ALL. WILL NOT WORK IN STRICT MODE. 
var someButton; 
someButton.addEventListener("click", function() { 
    console.log("clicked"); 
    someButton.removeEventListener("click", arguments.callee); 
}); 
4

? Like:

とにかく名前を付けてください。

var someButton; 
someButton.addEventListener("click", function once() { 
    console.log("clicked"); 
    someButton.removeEventListener("click", once); 
}); 

スタックトレースに関数名が表示されるようになりました。

+0

も参照してください:https://stackoverflow.com/questions/3854141/naming-an-anonymous-function – Eric

関連する問題