練炭ブログ

萌え壁紙、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")。

クロスブラウザ対応のイベント処理関数

コメントなし»

これ を参考に行数を短く。

// クロスブラウザ対応のイベント処理関数
function addEvent (node, type, handler) {
  if (node.addEventListener) {
    node.addEventListener (type, handler, false);
  }
  else if (node.attachEvent) {
    node.attachEvent ('on' + type, function (evt) { handler.call (node, evt); });
  }
}

呼び出された関数は、this がイベントの発生した要素、第一引数 evt が event オブジェクト。

使うかと思って用意したら必要なかった。

Bookmarklet: リンク先を文字サイズ1.5倍で開く

コメントなし»

直した
あと、2倍は大きすぎると思うので1.5倍に。

javascript:(function(l){var i,a;for(i=0;i<l.length;++i){a=l[i];if(a.href.length>0&&a.hef!='#'&&!a.href.match(/^javascript:/i)){a.onclick=function(){var w=open(this.href);w.document.onreadystatechange=function(){if(w.document.readyState=='complete')w.document.body.style.fontSize='150%'};return false;}}}})(document.links)

Sleipnir 1.66 用のスクリプトも作ってみた。
うまく動かなくて変なコードになってるけど。
newWindowSetStyle_20100425.zip

Bookmarklet: リンク先を文字サイズ2倍で開く

コメントなし»

試験的に作って 2ch に投下したもの。

[23:45 追記] 全然駄目だったので後で調べる。

javascript:(function(l){var i,a;for(i=0;i<l.length;++i){a=l[i];if(a.href.length>0&&a.hef!='#'&&!a.href.match(/^javascript:/i)){a.onclick=function(){var w=open(a.href);w.document.onreadystatechange=function(){if(w.document.readyState=='complete')w.document.body.style.fontSize='200%'};return false;}}}})(document.links)

  • 全てのリンクを新しいウィンドウで開く。
  • fontSize = '200%'zoom = 2 に変えてみるとか。
  • 設定値を現在のページから読み取るとか。
  • 開いたウィンドウから更に別のページを開いたり移動したりすると伝播しない。

文字が小さすぎて困るなら、最小フォントサイズを指定できるブラウザを使えばいいと思うの。