javascript传递求值变量

javascript传递求值变量,javascript,jquery,eval,execution,Javascript,Jquery,Eval,Execution,我有eval函数,它需要从php执行javascript。但我需要传递元素,这样我就可以将鼠标放在用户单击的链接上的提示上 var globalEval = function globalEval(src, element) { if (window.execScript) { window.execScript(src); return; } var fn = function(element) {

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

这是一个范围问题,因为全局eval调用的代码与变量
元素的作用域不同。如果您必须使用
eval
,那么您必须以一种允许您在所需环境中调用代码的方式来执行此操作。一种方法是将其包装为一个匿名函数,您可以为所选的环境变量提供参数

比如说

window.eval.call(window,'(function (element) {'+src+'})')(element);
这意味着
src
字符串被解析,但不会被
eval
调用,因为它返回一个匿名函数。然后调用它,传递数据,在本例中为
元素

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

如果您只想在计算某些代码时设置
,请尝试:

// 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)
使用函数构造函数意味着您将得到您期望的结果;全球评估带来了很多麻烦,其中一些可能会让你大吃一惊。如果你不需要它,最好避免它

现在,如果您确实想将其称为
元素
,也可以这样做:

code = 'alert(element)'
var use_element = 69
result = new Function("element", code).call(this, use_element)

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

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


 callBackFunc(){
  $data=response_repo;
 }

如果我正确地假设
src
始终是一个字符串,那么如果执行
window.eval.call(window'(function(element){'+src+'}'))(element),会发生什么情况?@PaulS。好的,我会试试并发回。为什么不只是本地的
eval(src)
,它会选择
元素
@Esailija,因为我喜欢把事情复杂化。不,我的回答中的方式意味着通过传递变量来指定环境并保护当前环境(因为函数是ByVal,诸如
element=otherElm
之类的更改在调用它的地方不起作用),而本地
eval(src)
将使用当前环境。它为您提供了有关调用它的其他选项(例如,使用
.call
)。我并不是说
eval
永远是“安全的”,但至少这种方式意味着你可以在你想要的环境中调用(假设
src
是有效的JavaScript)。@PaulS。非常感谢。现在可以了:)。顺便说一句,window.execScript(‘(函数(元素){'+src+'})’)(元素)?您应该改为使用:它更好地报告(语法)错误。@geocar+1,因为我同意,但这样做不涉及
eval
,这不是OP的问题。我喜欢您的建议。只是想知道它是否受到旧浏览器的支持,以及php中的javascript动态代码是否会执行良好的wihtout错误?@Basit-请参阅以了解浏览器兼容性。PHP不参与其中,您可以简单地执行如下操作:
result=newfunction(“element”),如果愿意,可以调用(this,use_element)