素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

グローバル変数とnew Function(バッドノウハウ)

関数内からグローバル変数を設定したい場合、

var global;
(function(){
  global = 42;
})();

とする事ができる。
ただし、グローバル以外にも同じ名前の物があると使えない。

var $;
(function(){
  $ = $;
  function $(id){
    return document.getElementById(id);
  }
})();

jQueryの場合、グローバル変数が、windowのプロパティになることを利用して、

(function(){
  window.$ = $;
  function $(id){
    return document.getElementById(id);
  }
})();

のようにしている。
この場合、Greasemonkeyなどのようにwindowがグローバルでない場合うまく動かない。
例えば、jQueryGreasemonkeyの@requireで読み込んだ場合、他のGreasemonkeyスクリプトからwindow.jQueryが触れるようになってしまう。
下のようにするとGreasemonkeyから利用する場合でもうまく動く。new Function()はevalと違って、実行されたスコープの影響を受けない。

(function(){
  function registerToGlobal(name, value){
    new Function("_" + name, name + " = _" + name)(value);
  }
  registerToGlobal("$", $);
  function $(id){
    return document.getElementById(id);
  }
})();