5

我有 Web 应用程序,它使用将jsonpjavascript 代码返回给客户端。

这是我返回的代码(使其不可读):

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函数中eval,我们现在将eval创建一个函数对象。

这可能吗?

他们的意思是一样的吗?

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

检查以下简化代码:正如我在评论中所说,第二种方法不起作用,因为它返回函数结果,

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 回答