5

jsonpjavascriptコードをクライアントに返すを使用するWebアプリケーションがあります。

これは私が返すコードです(読めないようにするため):

com.xx.load('xx','var name="hguser";function data(x){console.info(x); }')

load関数では、evalコードを使用します。

ただし、読み取り不能であることがわかりましたが、デバッグは不可能です。

だから私たちはこれを使うことができるかどうか疑問に思います:

com.xx.load('xx',function(){
  var name='hguser';
  function data(x){
    console.info(x); 
  }
});

次に、コード文字列のload内部にある関数で、関数オブジェクトになります。evaleval

これは可能ですか?

それらは同じことを意味しますか?

4

2 に答える 2

1

あなたは確かにできます。これは、JavaScriptで動的スコープをシミュレートするようなものです。注意すべきいくつかの事柄:

  1. 関数を直接操作することはできませんeval。文字列に変換する必要があります。を使用しeval(String(f))ます。
  2. 関数fに名前を付けます。あなたはできませんvar g = eval(String(f))。関数名を使用します。
  3. 気をつけて。この関数fは、すべてのローカル変数にアクセスできます。

例えば:

eval(String(getAdder()));

alert(add(2, 3));

function getAdder() {
    return function add(a, b) {
        return a + b;
    };
}

ここでデモを見ることができます:http://jsfiddle.net/5LXUf/

考えてみてください-関数オブジェクトを評価する代わりに、単にそれを呼び出さないのはなぜですか?これにより、スタックトレースが得られ、はるかに簡単で安全になります(関数はローカル変数にアクセスできなくなります)。

于 2012-10-22T04:01:34.067 に答える
0

次の簡略化されたコードを確認してください:コメントで述べたように、2番目のアプローチは関数の結果を返すため、機能しません。

var my_load=function(arg1,for_eval) {
     eval(for_eval);    
     data(1);
}


my_load('xx','var name="hguser";function data(x){console.info(x); }');

my_load('xx',function(){
  var name='hguser';
  function data(x){
    console.info(x); 
  }
});​
于 2012-10-22T04:00:48.080 に答える