我的网络应用程序使用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
一个函数对象。
这可能吗?
他们的意思是一样的吗?
答案 0 :(得分:1)
你确定可以。它就像JavaScript中的simulating dynamic scoping。有几点需要注意:
eval
一个功能。您需要将其转换为字符串。使用eval(String(f))
。f
命名。你做不到var g = eval(String(f))
。使用功能名称。f
可以访问所有局部变量。例如:
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);
}
});