9

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

4

3 回答 3

12

这是一个范围问题,因为全局 eval 没有在与变量相同的范围内调用代码element。如果你必须使用eval即使eval 是 evil,你必须以一种允许你在你想要的环境中调用你的代码的方式来做。一种方法是将其包装为匿名函数,您可以为选择的环境变量提供参数。

例如

window.eval.call(window,'(function (element) {'+src+'})')(element);

这意味着src字符串被解析但不被调用,eval因为它返回一个匿名函数。然后你调用它,传递你的数据,在这种情况下element

测试它,var element = document.body, src = 'console.log(element.tagName)';你会看到它 log "BODY"。请注意,如果您想以这种方式设置全局变量(或函数),则必须将它们显式声明为全局(window.foobar = ...),否则它们将在匿名函数完成后被 GCd。

于 2012-12-16T22:53:57.050 回答
6

如果您只想在评估某些代码时进行设置,请尝试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 构造函数意味着你会得到你所期望的;全球评估带来了很多包袱,其中一些可能会让您感到惊讶。如果您不需要它,最好避免它。

现在,如果您真的想调用它elementFunction 构造函数也可以这样做:

code = 'alert(element)'
var use_element = 69
result = new Function("element", code).call(this, use_element)
于 2012-12-16T23:07:46.310 回答
0

如果回调函数在同一个 dom 中,则在 eval 之前将全局变量设置为 repo,这将保留该变量。然后在你要调用的函数中使用全局变量。

var response_repo;
function someFunc($callback){
 ....
 success: function(result) {
            response_repo = result;
            eval($callback+'();');
        },
 ....
 }


 callBackFunc(){
  $data=response_repo;
 }
于 2021-01-31T02:22:32.090 回答