Javascript 从字符串绑定函数

Javascript 从字符串绑定函数,javascript,Javascript,我有一个自定义ASP.Net控件,该控件的函数名要附加到javascript对象中: <custom:myControl runat="server" id="something" OnClientOpened="myFunc" /> 我将函数绑定到slideUp参数,如下所示: // this code is inside an Object // Simplified for clarity $el.slideUp(200, window[state.onClientOpen

我有一个自定义ASP.Net控件,该控件的函数名要附加到javascript对象中:

<custom:myControl runat="server" id="something" OnClientOpened="myFunc" />
我将函数绑定到slideUp参数,如下所示:

// this code is inside an Object
// Simplified for clarity

$el.slideUp(200, window[state.onClientOpened]);
我无法控制进入OnClientOpened属性的内容,因此我测试了一些不在全局命名空间中的内容:

var MyObject = function() {

    var myFunc = function() {
        doSomething();
    };

    return {
        myFunc: myFunc
    };
}();
状态.onClientOpened
现在将包含:

onClientOpened = "MyObject.myFunc";
这显然打破了它。最好的方法是什么?我正在考虑某种评估,但如果可能的话,我希望有另一种方法

评估解决方案:

$el.slideUp(200, eval("window." + state.onClientOpened));

附加到
窗口
命名空间的变量只是
MyObject
,而不是
myFunc
。如果要访问该函数,请尝试这样做:

window["MyObject"]["myFunc"];
您可以使用
split
拆分来自服务器的字符串

var params = onClientOpened.split(".");

 $el.slideUp(200,window[params[0]][params[1]]);

只需将所有代码包装在一个匿名函数中,而不是其中的一部分,那么就不必担心全局命名空间污染。您不需要引用整个
窗口
rigamarole,只需将函数称为回调本身

(function () {

  var myFunc = function() {
    doSomething();
  };

  // Simplified for clarity
  $el.slideUp(200, myFunc);

})();
方法2 方法3
以下是我目前可以看到的选项

方法1(评估):

方法2(分析它):

var onclientOpened;
var splitArray=state.onclientpened.split(“.”);
对于(var i=0;i

方法2似乎是“最安全”的方法,但希望有其他选择。

谢谢,但我需要保留我展示的方法,我已经对许多代码进行了注释,解释了原因。好的,我添加了第二种方法,您可以尝试。这可以用,但字符串来自服务器,这就是为什么我不能使用它;正是我所想的,@itsmejodie实际上,我正在自我实例化MyFunc对象,这样它就可以像这样工作。我明白了,新的解决方案。在Chrome JS控制台中测试。我上次的更新回答了你的问题吗?
(function () {

  var myFunc = function() {
    doSomething();
  };

  // Simplified for clarity
  $el.slideUp(200, myFunc);

})();
var MyObject = {

  myFunc: function() {
    doSomething();
  }

};

onClientOpened = MyObject.myFunc;
// approach 2, but with this change:
onClientOpened = MyObject["myFunc"];

// or if MyObject also comes from the server,
onClientOpened = window["MyObject"]["myFunc"]
$el.slideUp(200, eval("window." + state.onClientOpened));
var onclientOpened;
var splitArray = state.onclientOpened.split(".");

for (var i = 0; i < splitArray.length; i++) {
    if (i == 0) {
        onclientOpened = window[splitArray[i]];
    } else {
        onclientOpened = onclientOpened[splitArray[i]];
    }
}

$el.slideUp(200, onclientOpened);