かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

javascript 続・即時関数のトラップ!

以前ファイル結合した際などに起こりうる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) 

aNumber型にキャストされてしまいます。
数字にできない'素敵なパーティ'の様な文字列や{hoge: function(b){ return b; }}の様なオブジェクトなどを返す即時関数だと
aNaNになってしまいます。

#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)

areturnされる値の型になります。
返されるのが1だと"number"という文字列になります。


まとめ
  • #1, #2 は期待される値のママになります
  • #3, #4 はNumber型にキャストされます
  • #5 はBooleanにキャスト
  • #6 は常にundefined。
  • #7 は返される値の型です。

変数に即時関数を入れるケースは見慣れた下記の書き方が良さそうです。

var a = (function() { return <返される値>; })();

 

[参考にしました]
即時関数(function(){ ... })()の別の書き方いろいろ - 泥のように