0

を使用せずに、おそらくスコープを含む文字列から関数を呼び出すにはどうすればよいでしょうかeval

アイデアは、dragEndCallback属性内にコールバックを指定し、それを呼び出して、ドラッグの開始オブジェクトと終了オブジェクトをパラメーターとして指定することです。私の場合、ある種の一般的なドラッグアンドドロップ。

ほとんどの人は 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 に答える