从字符串绑定函数

时间:2014-01-17 03:52:18

标签: javascript

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

<custom:myControl runat="server" id="something" OnClientOpened="myFunc" />

然后我有一个状态javascript对象,其字符串为“myFunc”:

state.onClientOpened // contains "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
    };
}();

state.onClientOpened现在包含:

onClientOpened = "MyObject.myFunc";

这显然打破了它。这是最好的方法吗?我正在考虑某种评估,但如果可能的话,我希望采用另一种方法。

Eval解决方案:

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

3 个答案:

答案 0 :(得分:2)

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

(function () {

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

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

})();

方法2

var MyObject = {

  myFunc: function() {
    doSomething();
  }

};

onClientOpened = MyObject.myFunc;

方法3

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

// or if MyObject also comes from the server,
onClientOpened = window["MyObject"]["myFunc"]

答案 1 :(得分:0)

附加到window命名空间的变量只是MyObject,而不是myFunc。如果您想访问该功能,请尝试这样做:

window["MyObject"]["myFunc"];

您可以使用split分割来自服务器的字符串。

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

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

答案 2 :(得分:0)

到目前为止,我可以看到以下选项。

方法1(评估):

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

方法2(解析):

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);

方法2似乎是“最安全”的方法,但会欣赏其他选择。