この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

function宣言は式

こんなケースがありました。(※jQueryを使ってます)

var foo = function() {
    // do something...
};

// 最初に一回だけ実行する
foo();

// ウィンドウリサイズイベントをリッスンする
$(window).resize(foo);


で、コレを何とか1行で書けないかなぁ、と思ったので次のようにしました。

// ウィンドウリサイズイベントをリッスンする
$(window).resize(

    function() {
        // do something...

        return arguments.callee; //自分自身を返す

    }() // 関数を作成して同時に一度実行する→戻り値が自分自身なのでresizeの引数として渡せる

); 


これで(ムリヤリだけど)1行で書けたことになります。

しかし。。。

上記のスクリプトをECMAScript5 Strict Modeで動作させると、
『calleeは使うなゴルァ!』というエラーが出る。


さてどうしたものか、と考えたのですが、このようにすると良いことがわかりました。

"use strict";

$(window).resize(

    function resizeHandler() {
        // do something...

        return resizeHandler; // calleeを使うのをやめ、関数名で参照
    }()

); 

これで正しく動作します。つまり、Javascriptにおける関数宣言は式(Expression)だったわけです。
知らなかった。。。

ちなみに

コレはダメ。エラーになります。

$(window).resize(

    var resizeHandler = function() {
        // do something...

        return resizeHandler;
    }()

); 

追記

上記のコードは大体のブラウザで動きますが、これはECMAScriptの仕様違反らしいです。
IE9では、個のコードがエラーになるように『修正』されたらしい。