0

您将如何从字符串调用函数,可能包括范围,并且不使用eval.

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

大多数人会告诉你使用 eval,但它不安全、速度慢,而且总体上是一个非常糟糕的主意。

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

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

2 回答 2

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]];
}
于 2012-10-03T15:25:03.010 回答
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);
于 2012-10-03T16:01:41.080 回答