我有eval功能,需要从php执行javascript。但我需要传递元素,所以我可以将鼠标放在用户点击的链接上。
var globalEval = function globalEval(src, element) {
if (window.execScript) {
window.execScript(src);
return;
}
var fn = function(element) {
window.eval.call(window,src);
};
fn(element);
};
使用以下方式传递$(this)
元素
globalEval(js_code, $(this));
// js_code is = alert(element);
我得到了未定义元素的错误,这是globalEval();
中定义的,如何解决这个问题?
答案 0 :(得分:8)
这是一个范围问题,因为全局eval没有调用与变量element
相同范围内的代码。如果您必须使用eval
即使eval is evil,也必须以允许您在所需环境中调用代码的方式执行此操作。一种方法是将其包装为匿名函数,您可以为所选的环境变量提供参数。
例如
window.eval.call(window,'(function (element) {'+src+'})')(element);
这意味着src
字符串被解析但eval
没有调用,因为它返回一个匿名函数。然后,您调用它,传递数据,在本例中为element
。
使用var element = document.body, src = 'console.log(element.tagName)';
对其进行测试,您会看到它记录为"BODY"
。请注意,如果要以这种方式设置全局变量(或函数),则必须将它们声明为全局显式(window.foobar = ...
),否则在匿名函数完成后它们将是GCd。
答案 1 :(得分:3)
如果您想要做的 all 在评估某些代码时设置了this
,请尝试:
// Code you want to evaluate
var code = 'return this.whatever'
// What you want "this" bound to:
var that = { whatever: 69 }
// Now do this:
var result = new Function(code).call(that)
使用Function构造函数意味着您将得到您期望的结果;全球评估带来了很多包袱,其中一些可能让您大吃一惊。如果你不需要,最好避免使用它。
现在,如果您真的想要将其称为element
,那么Function constructor也可以这样做:
code = 'alert(element)'
var use_element = 69
result = new Function("element", code).call(this, use_element)
答案 2 :(得分:0)
如果回调函数在同一个dom中,那么在eval之前设置一个全局变量作为repo,这将保留该变量。然后在您要调用的函数中使用全局变量。
var response_repo;
function someFunc($callback){
....
success: function(result) {
response_repo = result;
eval($callback+'();');
},
....
}
callBackFunc(){
$data=response_repo;
}