eval(字符串)和eval(函数)之间的区别

时间:2012-10-22 02:49:34

标签: javascript eval

我的网络应用程序使用jsonp将javascript代码返回给客户端。

这是我返回的代码(使其无法读取):

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一个函数对象。

这可能吗?

他们的意思是一样的吗?

2 个答案:

答案 0 :(得分:1)

你确定可以。它就像JavaScript中的simulating dynamic scoping。有几点需要注意:

  1. 你不能直接eval一个功能。您需要将其转换为字符串。使用eval(String(f))
  2. 为函数f命名。你做不到var g = eval(String(f))。使用功能名称。
  3. 小心点。函数f可以访问所有局部变量。
  4. 例如:

    eval(String(getAdder()));
    
    alert(add(2, 3));
    
    function getAdder() {
        return function add(a, b) {
            return a + b;
        };
    }
    

    您可以在此处查看演示:http://jsfiddle.net/5LXUf/

    只是一个想法 - 而不是评估函数对象为什么不只是调用它?这将为您提供堆栈跟踪,它更简单,更安全(该函数无法访问您的本地变量)。

答案 1 :(得分:0)

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

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); 
  }
});​