問答収集 カテゴリ:JavaScriptプログラミング
現在のスレッド一覧 / 新規に質問を投稿
レス数:3 / 状態:未解決 / No:6 / ATOM
1 名前:へぼゲーマー 日付:2014/06/08(日)02:10:00 ID:t76HW7tmxyZI
管理人さん、こんにちは
たまに考えを投稿させてもらっています。

■カレントターゲットを取得する

if(element.attachEvent){
// 匿名関数を即時実行する
(function(){
var current_target = document;
current_target.attachEvent("onclick" , function (e){
console.log(current_target);
});
})();
}

スコープは関数を定義した時のものになりますので、クロージャでなくても
このコードでは、current_targetはスコープ出来ていると思います。
これが問題なのは、即時定義させる無名関数ではなく定義済み関数を登録させる時でしょう。
既成関数では外側のスコープは簡単には入れることができないと思います。

私のやり方は、カレントターゲットは変数ではなく、実行する時にグローバルなeventオブジェクトに
currentTargetプロパティを書き加えてしまいます。
イベントリスナーの時もアタッチイベントの時も、e.currentTargetでカレントターゲットが取得できます。


■無名関数を使ったリスナーの登録を解除する

関数名を記述して、自身の関数への参照を取得する事もできますが、IE8 以前では機能しません。


う~ん、、、IE8以下でできないんですか?
さっきと同じで、匿名関数は、定義をその場で行うので

var f;
document.attachEvent("onclick" , f=function (e){
// この中でfのスコープは可
document.detachEvent("onclick" ,f);
});

だと思います。IE8、7、ともにIE11の開発ツールを使ってエミュレート動作で確認するとデタッチできています。
私の勘違いでしょうか?
2 日付:2014/06/08(日)20:27:09 ID:uqGvQ4UrzKin
>関数名を記述して、自身の関数への参照を取得する事もできますが、IE8 以前では機能しません。

以下の様な書き方が、IE8 以前では利用できないという事ですね。

document.attachEvent("onclick" , function MyFunc (e){
document.detachEvent("onclick" , MyFunc);
});
3 名前:へぼゲーマー PR: 参考: 日付:2014/06/10(火)05:17:52 ID:t76HW7tmxyZI
ありがとうございました

とても参考になりました

引数の中で関数宣言をするという発想が滅多にと言うか、いままで一度も覚えも及ばなかったので・・
functionの右に名前を持ってくる、つまりvarによる変数宣言に近く、
引数の中で変数宣言をやると、
エラーですので気持ち悪く見えてしまいます









このスレッドについて
質問の状態 :
未解決
投稿開始日 :
2014/06/08(日)02:10:00
投稿終了日 :
2014/06/17(火)05:26:26
投稿者 :
へぼゲーマー
レス総数 :
3
スレッド番号 :
6
MondoCollectionSystem ver.0x00020000 by Hakuhin