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

Function#toString()とswitch構文

switchをつかった以下のようなコード

以下の現象ははFirefox(1.5.0.7)で確認しました(2では問題無)。Function#toString()は信じると痛い目にあうという話。switch構文は以下のようにかける(PHPでもOK!)*1

function foo()
{
   switch(true)
   {
      case (typeof(a) != 'undefined'):
          alert('a');
          break;
      case (typeof(b) != 'undefined'):
          alert('b');
          break;
   }
}

Function#toString()すると?

以下のようなコードを書いて foo.toString(); をすると以下のコードが返ってくる。げげげっdefaultが勝手に補足されてるよw

function foo()
{
    switch (true)
    {
      case (typeof (a) != "undefined"):
        alert("a");
        break;
      case (typeof (b) != "undefined"):
      default:
        alert("b");
        break;
    }
}
|<
**でも実行結果は
↑のコードを実行してもalert('b');は実行されません。ただ↓のコードを実行するとalert('b')が間違いなく実行されてしまうわけで…。eval(foo.toString())みたいなことをやると注意が必要っていう話。

*1:switch(true){ }の部分です。