如何从字符串中调用函数?

时间:2012-10-03 15:25:03

标签: javascript namespaces callback scope eval

如何从字符串调用函数,可能包括范围,而不使用eval

我的想法是,我想在dragEndCallback属性中指定一个回调,并调用它将拖动开始和结束对象作为参数。在我的情况下,某种通用的拖放。

大多数人都会告诉你使用eval,但它总体上不安全,速度慢,而且总体上非常糟糕。

以下是我想支持的一些示例字符串:

"NamespaceA.functionName"
"functionName"
"NamespaceB.NamespaceA.functionName"
"ClassB.methodName"

2 个答案:

答案 0 :(得分:1)

这是一种通用,干净,方便的方法。如果找不到该函数,则返回undefined。

window.getFunctionFromString = function(string)
{
    var scope = window;
    var scopeSplit = string.split('.');
    for (i = 0; i < scopeSplit.length - 1; i++)
    {
        scope = scope[scopeSplit[i]];

        if (scope == undefined) return;
    }

    return scope[scopeSplit[scopeSplit.length - 1]];
}

答案 1 :(得分:0)

如果通过“范围”表示要为该功能带来什么范围,那么这样的事情可以起作用:

var callFn = function(str, scope) {

    scope = scope || window;

    var namespaces = str.split('.'),
        fn = window; // or whatever root you want

    while(fn = fn[namespaces.shift()]){
        if(typeof fn == 'function') {
            fn.call(scope);
            return;
        }
    }
};

示例:

window.ns = {
    one: {
        two: function(){ console.log('Two!') }
    }
};
window.foo = function() {
    console.log(this); // document
};

callFn('ns.one.two');
callFn('foo', document);