練炭ブログ

萌え壁紙、Irvine、DMonkey、Proxomitron などの情報を扱ってます。

Irvine/DMonkey: 即時関数パターン

2 個のコメント»

(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")。

2 Responses

  1. これは、どうでしょうか?
    //----
    function(){
    sssss="JavaScript is not JAVAapplet";
    sss=sssss.match(/java[a-z]*/gi);
    for(ccc in sss)
    alert(sss[ccc]);
    }

  2. 普通の関数定義に見えますが。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です