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

hgu*_*ser 5 javascript eval

我有web应用程序,它使用jsonp返回javascript代码到客户端.

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

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

load功能中,我们eval的代码.

但是,我们发现它不可读,但它是不可调试的.

所以我想知道我们是否可以使用它:

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

然后,在代码字符串的load函数insead中eval,我们现在将成为eval一个函数对象.

这可能吗?

他们的意思是一样的吗?

Aad*_*hah 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;
    };
}
Run Code Online (Sandbox Code Playgroud)

您可以在这里看到演示:http://jsfiddle.net/5LXUf/

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