如何从字符串调用函数,可能包括范围,而不使用eval
。
我的想法是,我想在dragEndCallback
属性中指定一个回调,并调用它将拖动开始和结束对象作为参数。在我的情况下,某种通用的拖放。
大多数人都会告诉你使用eval,但它总体上不安全,速度慢,而且总体上非常糟糕。
以下是我想支持的一些示例字符串:
"NamespaceA.functionName"
"functionName"
"NamespaceB.NamespaceA.functionName"
"ClassB.methodName"
答案 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);