3

我的对象有一个回调:

var MyObject = {
CallBack: "function (whichSubMenuIsClicked, subMenuObjectTag) { self.doStuff(whichSubMenuIsClicked.SubMenuItem, whichSubMenuIsClicked.HeaderColumnName, whichSubMenuIsClicked.DivIdentifier);}",
}

回调是一个字符串。现在我需要使用 MyObject.CallBack(param1, param2) 执行它如何使用 jquery 或 javascript 来完成。在这种情况下, self 是调用另一个小部件的原始小部件。因此,回调在原始小部件上。

4

4 回答 4

3

只是没有将函数作为字符串。

将函数作为函数:

var MyObject = {
   CallBack: function (whichSubMenuIsClicked, subMenuObjectTag) {
                  self.doStuff(whichSubMenuIsClicked.SubMenuItem, whichSubMenuIsClicked.HeaderColumnName, whichSubMenuIsClicked.DivIdentifier);
             }
}
于 2012-11-23T14:12:10.830 回答
1

使用Function构造函数,它接受参数名称列表,后跟函数体:

var MyObject = {
    CallBack: "self.doStuff(whichSubMenuIsClicked.SubMenuItem, whichSubMenuIsClicked.HeaderColumnName, whichSubMenuIsClicked.DivIdentifier)",
};

var myfunc = new Function("whichSubMenuIsClicked", "subMenuObjectTag", MyObject.CallBack);
于 2012-11-23T14:17:24.550 回答
0

正如@Curt 演示的那样,您应该将函数编写为函数。只有当您除了将其作为字符串获取(例如从用户输入)之外别无选择时,您首先需要将其解析为可执行代码,然后您可以调用该代码。这样做的方法是eval。问题将成为参考self,它不是函数内部的变量,并且会被假定为全局变量。但是,您可以使用with语句来解决此问题:

var MyObject = {
    CallBack: "function (whichSubMenuIsClicked, subMenuObjectTag) { self.doStuff(whichSubMenuIsClicked.SubMenuItem, whichSubMenuIsClicked.HeaderColumnName, whichSubMenuIsClicked.DivIdentifier);}",
};
var widget = {doStuff: console.log};
var fn;
with( {self: widget} ) {
    fn = eval( MyObject.CallBack );
}
fn({SubMenuItem: "…", HeaderColumnName: "…", DivIdentifier: "…"});
于 2012-11-23T14:23:09.077 回答
-2

非常糟糕的方法,但你可以通过eval()

var MyObject = { CallBack: "AName = function(param1, param2) { alert(param1 + param2); }", }

eval(MyObject.CallBack+"(1,2)"); 

演示

于 2012-11-23T14:12:45.180 回答