knowledge base

マークアップ/フロントエンドエンジニアのWEB制作における備忘録です。平日はWEB屋、休日は社会人劇団の主宰・劇作家をしています。

関数内でその関数自身を取得実行する

関数内で、その関数自身の情報を得たいなと思っていました。

次の方法で可能となります。

var functionA = function(){
   console.log(arguments);
}

argumentsというオブジェクトは、本来名前の通り関数に渡された引数を参照できる配列に似たものです。

もし関数に3つの引数が渡されたなら、arguments[0], arguments[1], arguments[2]という具合に参照ができます。

arguments.callee

さて、argumentsにはlengthとcalleeというプロパティがあり、lengthは引数の数、calleeは現在実行している関数の関数本体を示します。

今回用いるのは、まさしくこのarguments.calleeというプロパティです。

このarguments.calleeにはいくつかプロパティがあり、関数名などを取得することができます。

var functionA = function(){    
   console.log(arguments.callee); /* 関数そのものを出力 */
   console.log(arguments.callee.name); /* 関数名(functionA)を出力 */
}

arguments.calleeは関数本体を参照するため、呼び出すことが可能です。

たとえば、無名関数内で再帰処理をしなければいけない時などに利用できます。

ちなみに下記コードは再帰処理を終わらせるための分岐を書いていないので、無限ループになります。あしからず。

function(){
  /* 関数名を与えなくても再帰呼び出しできる */ arguments.callee(); }

また、自分自身をイベントにon/offすることもできます。

下記例ではmyEventというカスタムイベントに一度関数を紐づけたのち、その関数実行後にイベントとの紐づけを解除しています。

myEventというイベントは何度も起こりえますが、それに紐づけた関数onMyEventFuncは一度のみの実行でよい場合に使えます。 (※ちなみにカスタムイベント作成のプログラムは省略しています)

var onMyEventFunc = function(){
    $(window).off('myEvent', arguments.callee );
}
$(window).on('myEvent', onMyEventFunc );

余談

しかしながら、strictモードの際にこのプロパティを参照するとエラーになるそうです。

紹介した割に、最近は非推奨になっているという悲しい結末で申し訳ありません。

どうやら引数に対して操作を行えるということが、あまりよろしくないそうです。

strictモードでは、関数名を与えたり、引数を別の変数で受け取る等の代替案をとらなければいけません。