みかづきブログ その3

3ヶ月つづけてみました。

JavaScriptでif文の中で関数を定義する

MOZILLA DEVELOPER NETWORK には、

JavaScript では、条件に基づいて関数を定義することもできます。例えば次の関数の定義は、変数 num が 0 に等しい場合のみ myFunc という関数を定義します:

if (num == 0){
  function myFunc(theObject) {
    theObject.make = "Toyota"
  }
}

num が 0 に等しくない場合は関数が定義されず、その関数を実行しようとしても失敗します。
ECMAScript は、このようにコンテキスト内で関数が現れることを認めておらず、別の関数内またはプログラムのトップレベルのみとしています。よって、この例は ECMAScript として不正です。

警告: この非標準構造は、別の JavaScript の実装では異なる扱いを受けますので、可搬性があるコードを記述する際は避けるべきです。さもなければコードが、あるブラウザでは動作するが別のブラウザでは動作しない状態になるかもしれません。

developer.mozilla.org


という記載がありますが、Titaniumにおいては別の関数内またはプログラムのトップレベル以外で関数宣言を行うと、しっかりエラーになってビルドができないようです。

// エラーになります
if (num === 0) {
    function hello() {
        alert("hello");
    })();

    hello();    
}

どうしてもif文の中で関数を定義して実行したい場合は関数式を使えば一応動きます。

if (num === 0) {
    var hello = function() {
        alert("hello");
    })();

    hello();    
}
if (num === 0) {
    (function() {
        alert("hello");
    })();
}

また、if文のなかでつくった関数を再帰的に呼び出したい場合は、名前付きの関数式をつかえば実現できる気がします。

if (num === 0) {
    var infinityHello = function hello() {
        alert("hello");
        setTimeout(hello, 1000);
    })();

    infinityHello();    
}
if (num === 0) {
    (function hello() {
        alert("hello");
        setTimeout(hello, 1000);
    })();
}