以前ファイル結合した際などに起こりうるJavascriptの即時関数のトラップについて書きました。
しかし、即時関数にはまだトラップがあったのです!
( -言- )ククク... それは、、、
変数に即時関数を代入する時に即時関数の書き方で代入される値が変化してしまう!! というトラップ。なのです!
#1.
var a = (function() { return '1'; })(); // a ... "1" (Strings)
a
返された値のママになります。
#2
var a = (function() { return '1'; }()); // a ... "1" (Strings)
#1同様にa
返された値のママです。
#3
var a = +function() { return '1'; }(); // a ... 1 (Number)
a
はNumber型にキャストされてしまいます。
数字にできない'素敵なパーティ'
の様な文字列や{hoge: function(b){ return b; }}
の様なオブジェクトなどを返す即時関数だと
a
はNaN
になってしまいます。
#4
var a = -function() { return '1'; }(); // a ... -1 (Number)
#3 と同様にNumber型にキャストされます。そしてマイナスになります。
同じようにNumber型にできない時はNaN
を返します。
#5
var a = !function() { return '1'; }(); // a ... false (Boolean)
!1
した時のようにBoolean型にキャストされます。
var a = !!function() { return '1'; }()
みたいにすればtrue
になりますが...
#6
var a = void function() { return '1'; }(); // a ... undefined
これは 常にundefined
を返します。
変数に代入する時には使えないですね。。。
#7
var a = typeof function() { return '1'; }(); // a ... "string" (String)
a
はreturnされる値の型になります。
返されるのが1
だと"number"
という文字列になります。
まとめ
- #1, #2 は期待される値のママになります
- #3, #4 はNumber型にキャストされます
- #5 はBooleanにキャスト
- #6 は常にundefined。
- #7 は返される値の型です。
変数に即時関数を入れるケースは見慣れた下記の書き方が良さそうです。
var a = (function() { return <返される値>; })();