2009/08/25
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する方法
Re:JavaScriptで外側のスコープでevalする方法
Re:JavaScriptで外側のスコープでevalする方法