我正在尝试从返回的对象内执行私有函数。如果我提前知道函数的名称,这很容易,但是在这种情况下,我将不知道可用的函数。我所拥有的是一个带有要调用的函数名称的字符串。有没有办法通过字符串调用这些函数?
function foo() {
// some misc. chunk of valid javascipt code
function bar() {
console.log("hello");
}
// end misc. code
// I would like to avoid doing this if I don't have to
var executableFn = {};
executableFn.test = function() {
bar();
}
// end
return {
// This works but requires I know the name of the funciton ahead of time.
// All I have is a string name of the function to call.
funcRunner0: function() {
bar();
},
// My ideal method for calling but does not work
funcRunner1: function(functionName) {
foo[functionName]();
},
// This works but I'm trying to avoid eval. I'm not sure if this is not so bad
funcRunner2: function(functionName) {
var func = eval(functionName);
func();
},
// This works. I'm not sure if this is worse than funcRunner2 or the same;
funcRunner3: function(functionName) {
eval(functionName + "()");
},
// This works but requires the executableFn object which I would like to avoid if at all possible.
funcRunner4: function(functionName) {
executableFn[functionName]();
},
};
}
var bas = foo();
// This works but assumes I know the name of the function to call which I don't.
bas.funcRunner0();
// This doesn't work
bas.funcRunner1("bar");
// This works
bas.funcRunner2("bar");
// This works
bas.funcRunner3("bar");
// This works but is not my ideal
bas.funcRunner4("test");
这些都是我想出的所有调用此函数的方法。您认为我用字符串调用bar函数的最佳方法是什么?感谢您的帮助。
我理想的通话方法,但不起作用
foo[functionName]();
是的,正在尝试访问该foo
函数的[public]属性。例如,它将与该"call"
方法一起使用。
这可行,但我正在尝试避免评估。我不确定这是否还不错
var func = eval(functionName); func();
这可行。我不确定这是否比funcRunner2或更糟。
eval(functionName + "()");
从eval
s的角度来看,两者都一样糟糕。选项1确实使使用参数[无需动态求值]更容易。
这可行,但是需要exec对象,如果可能的话,我想避免该对象。
exec[functionName]();
那只是做到这一点的方法。由于exec
是foo
作用域中的局部变量,因此您甚至可以拥有自己的私密性。看来你已经切换exec
为publicObj
也
// I would like to avoid doing this if I don't have to var publicObj = {}; publicObj.test = function() { bar(); }
该publicObj
变量,尽管它的名字,而不是公共-它声明的局部用var
关键字!顺便说一句,您可以将其简化为
var exec = {
test: bar
};
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句