(function(){ ... })()の別の書き方いろいろ - 泥のように
こちらを見て、DMonkey でも JavaScript と同じように動作するのかを調査してみました。
- Irvine 1.3.1.127 & DMScript 0.3.12
- 「スクリプトを直接実行」から実行。
var a = "global";
(function(){
var a = "another paren";
alert(a); //"another paren"
}());
//OK
+function(){
var a = "plus";
alert(a); //plus
}();
// 関数は実行されるがその直後に ENameError(-1)
-function(){
var a = "minus";
alert(a); //minus
}();
// 関数は実行されるがその直後に ENameError(-1)
!function(){
var a = "ex";
alert(a); //ex
}();
// OK
void function(){
var a = "void";
alert(a); //void
}();
// OK
typeof function(){
var a = "typeof";
alert(a); //typeof
}();
// OK
new function(){
var a = "new";
alert(a); //new
};
// NG
+ 演算子、- 演算子がエラーになります。
上のサンプルコードでは関数が値を返していないので undefined として評価されますが、DMonkey では undefined に対する算術演算がエラーになるためです(JavaScript では +undefined や -undefined が NaN という演算結果になります)。
以下のように、有効な値を返せば動作します。
+function(){
var a = "plus";
return a;
}();
// OK
-function(){
var a = "minus";
return a;
}();
// OK
new を使う方法は動作しません。new 自体の仕様が JavaScript と違うようです。
次に、そのまま書くパターン。
var b = [ function(){ alert("array"); }() ];
// OK
var b = function(){ alert("bare"); }();
// OK
問題なく動作します。
代入の場合。
res = (function(){return "1";})(); //string の "1"(元のまま)
res = +function(){return "1";}(); //number の 1
res = -function(){return "1";}(); //number の -1
res = !function(){return "1";}(); //false
res = void function(){return "1";}(); //null
どれも値を返しているので動作します。
なお、void にキャストした結果が JavaScript では undefined ですが、DMonkey では null になります(ちなみに typeof null は "object" ではなく "null")。