Personal tools
You are here: Home ブログ matsuyama JavaScriptで外側のスコープでevalする方法
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.

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
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


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