Personal tools
You are here: Home ブログ matsuyama
Document Actions

JavaScriptで外側のスコープでevalする方法

次のコードを見てください。

var Package = (function() {
  function foo(t) {
    eval(t);
  }

  function bar() {
    alert('inner bar');
  }

  return {
    foo: foo
  }
})();

function bar() {
  alert('outer bar');
}

Package.foo('bar()');

このコードをブラウザで実行するとinner barと表示されます。パッケージを使う側としては外側のbarが呼ばれることを想定しているはずですが、パッケージの内部関数が(不当に)呼び出されてしまっています。JavaScriptのevalがレキシカルスコープを考慮する点を思い出すと、こうなる理由は納得できます。が、外側のbarが正しく呼ばれるために、何らかの方法で外側のスコープでevalできる必要があります。とはいってもどうするのが最良なのかわかりません。とりあえず僕が考えた解決策を一つ示しておきます。

var Package = (function(outerEval) {
  function foo(t) {
    outerEval(t);
  }

  function bar() {
    alert('inner bar');
  }

  return {
    foo: foo
  }
})(function(t) {eval(t)});

パッケージを作成するためのブロックスコープに、外側のスコープでevalする関数を渡すようにしています。これにより正しくinner barと表示されるようになります。IE, Firefox, Safariでは正しく動作することを確認しています。もっといい方法をご存知の方はコメント欄で教えていただけると幸いです。

Category(s)
javascript
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/matsuyama/javascript-eval-scope/tbping

Re:JavaScriptで外側のスコープでevalする方法

Posted by research papers at 2010-06-24 15:03
When you run this code in the browser and the inner bar is displayed. The outer package is used as the bar should be assumed to be called, the internal functions of the package (unfairly) are've been called. JavaScript's eval and lexical factors to consider but remember, you can understand why this would happen.

Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.