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する方法
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.
Re:JavaScriptで外側のスコープでevalする方法
Posted by
custom essay
at
2010-09-02 16:26
情報を共有していただきありがとうございます。これは、本当に魅力的な読み取りのために作ら。私はあなたの次の記事についていくことを確認、おかげされます。私は自分のウェブサイト上で JavaScriptを使用して大好きです。
Re:JavaScriptで外側のスコープでevalする方法
Posted by
how to fight
at
2010-11-09 22:06
I'm trying to learn java script but its really difficult, think I'll stick with html