javascript传递eval变量

时间:2012-12-16 22:36:20

标签: javascript jquery eval execution

我有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();中定义的,如何解决这个问题?

3 个答案:

答案 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;
 }