javascriptの高階関数について


<script type="text/javascript">
function test1(a,func){
document.addEventListener(a,func,false);
}
test1("click",function(ev){
n=ev.screenX;
});

console.log(n);
</script>

といいう感じで取得した座標nを関数の外console.log(n)の位置で取得したいのですが
どうすればいいのでしょうか?

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/12/06 12:18:38

ベストアンサー

id:TransFreeBSD No.1

回答回数668ベストアンサー獲得回数268

http://jsfiddle.net/LRU4M/

function test1(a, func) {
    document.addEventListener(a, func, false);
}
test1("click", function (ev) {
    n = ev.screenX;
});

test1("click", function (ev) {
    console.log(n);
});

質問としては「関数の外で取得したい」というよりも(普通に取得出きるので)「関数の終了後に別の関数を実行したい」という事になるかと思った。
ちなみにこれの n は window.n になります。所謂グローバル変数です(グローバル変数にしなくてもOKです http://jsfiddle.net/LRU4M/2/ )。

以下蛇足
addEventListenerの仕様を読むと下記じゃないとダメかと思ったけど上記でOKっぽい。なんでだろう。
http://jsfiddle.net/8wWd3/1/

https://developer.mozilla.org/ja/docs/Web/API/EventTarget.addEventListener

ターゲットに対して 2 つ以上のイベントリスナーを登録するには、同じターゲットに対して、異なるイベントタイプ、あるいは、キャプチャパラメータを指定して addEventListener() を呼び出します。

その他の回答0件)

id:TransFreeBSD No.1

回答回数668ベストアンサー獲得回数268ここでベストアンサー

http://jsfiddle.net/LRU4M/

function test1(a, func) {
    document.addEventListener(a, func, false);
}
test1("click", function (ev) {
    n = ev.screenX;
});

test1("click", function (ev) {
    console.log(n);
});

質問としては「関数の外で取得したい」というよりも(普通に取得出きるので)「関数の終了後に別の関数を実行したい」という事になるかと思った。
ちなみにこれの n は window.n になります。所謂グローバル変数です(グローバル変数にしなくてもOKです http://jsfiddle.net/LRU4M/2/ )。

以下蛇足
addEventListenerの仕様を読むと下記じゃないとダメかと思ったけど上記でOKっぽい。なんでだろう。
http://jsfiddle.net/8wWd3/1/

https://developer.mozilla.org/ja/docs/Web/API/EventTarget.addEventListener

ターゲットに対して 2 つ以上のイベントリスナーを登録するには、同じターゲットに対して、異なるイベントタイプ、あるいは、キャプチャパラメータを指定して addEventListener() を呼び出します。

id:hrhakbn

確かに関数の外で処理するんじゃなくて、関数内で処理する方向で考えた方が

いいような気がしてきました。

丁寧な回答ありがとうございます。

参考にさせてもらいます。

  • id:Lhankor_Mhy
    その書き方で動作すると思うのですが、なにが問題ですか?
  • id:hrhakbn
    コメントありがとうございます。

    動作するはずですか?

    やりたいことは、関数の中(test1)で取得した変数nの値を関数の外で使いたいということなんですが、
    console.log(n);の出力結果は n is not defined となってしまっています。

    何がいけないのでしょうか・・・・
  • id:Lhankor_Mhy
    もしかして、このコードをそのまま実行してるんですか?
    それだと、スクリプトを読み込んだ時点、クリックする前にnを取得してしまうことになるので、現実的にnに値が入ることはまずないと思うんですが。nを取得するタイミングみたいなものはないんですか?
  • id:hrhakbn
    このコードそのまま実行してます。

    関数内のnに数値が入るのは画面をクリックしたときで

    <script type="text/javascript">

    function test1(a,func){
    document.addEventListener(a,func,false);
    }

    test1("click",function(ev){
    n=ev.screenX;
    console.log(n);

    });

    </script>

    こんな感じでコンソールへの出力を関数内で処理すれば、画面をクリックするたびに座標がコンソールに出力されていくのですが、
    このとき取得したnを関数の外でも使いたいということなんです。

    説明がややこしくてすみません。

    return n とかやってみてもどこに返ってくるか分からず混乱してます。

    なんか基本的なことを見落としている気もするのですが・・・・

  • id:Lhankor_Mhy
    >関数の外でも使いたい
    この書き方じゃダメってことですよね?
    function test1(a,func){
     document.addEventListener(a,func,false);
    }
    test1("click",function(ev){
     n=ev.screenX;
     log();
    });

    function log(){
     console.log(n);
    }
     
    settimeoutでも使うしかないかな?
  • id:hrhakbn
    色々とコメントありがとうございました。
    おかげで少し考えが整理されてきました。
    根本をもう少し考え直しててみます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません