読者です 読者をやめる 読者になる 読者になる

亀岡的プログラマ日記

京都のベッドタウン、亀岡よりだらだらとお送りいたします。

JavaScriptメソッド登録時の挙動の違い。

今日地味にはまったので,忘れないうちに書いておこう。

Javascriptではメソッドの定義方法が割といっぱいありますが、大きく分けると、

  1. 宣言的に書く
  2. オブジェクト的に書く

の二種類かな、と想います。

宣言的に書く

宣言的に書くっていうのは、要するに、

function MyMethod() {}

という、C言語と同じような書き方。
C言語系から来た人は、まあこういう書き方をしますよね。

オブジェクト的に書く

オブジェクト的に書くというのは、関数オブジェクトとして関数を定義すること。
つまり、

myMethod = function () {}

個人的な趣味だと、こっちのほうが好きだったりします。
ていうか、結局実態としてはJavascriptは関数もオブジェクトなわけで、
下手にCっぽくかいてごまかすよりもこっちのほうが誤解が少ないかなーと。

二つの挙動の違い。

それで、こっからが本題なんですが。
このコードだと、MyMethodはオブジェクトとして作成されます。(Chromeで確認)

        if (false) {
            function MyMethod() {
                alert("hoge");
            }
        }

ところが。
以下のコードだとMyMethodは作成されません。

        if (false) {
            MyMethod = function () {
                alert("hoge");
            }
        }

つまり、宣言的に書いてしまうとどこに書かれていようが評価され、関数オブジェクトとして作られてしまうんですよね。
ところが、後者の書き方だと、変数の宣言式のように評価されるので、if文に切られて入らないと。

気持ちはわかるんけど、個人的には統一してほしい。
運用上はどっちかに統一して書け、みたいな話になるんだろーなー。