在现有的实现中(不能更改结构),我试图调用一个嵌套在另一个函数中的函数:
function outer(innerFunction, obj) {
//TODO: call innerFunction here, passing obj as first parameter
function inner1(obj) {
alert(obj.key);
}
}
outer('inner1', {key:'value'});
jsfiddle在这里:http://jsfiddle.net/tbyyw/
我已经考虑过使用eval()
,但我不知道如何传递一个对象 - 他们说'eval是邪恶的';)
我提出的另一个解决方案是检查innerFunction字符串,但这意味着我必须知道存在哪些内部函数(此外,添加新函数意味着必须编写额外的检查):
if(innerFunction == 'inner1') inner1(obj);
那么还有另一种方法可以不改变整体实施吗?
答案 0 :(得分:1)
这是你想要的吗?
function outer(innerFunction, obj) {
var fn = {
inner1: function (obj) {
alert(obj.key);
}
};
fn[innerFunction](obj);
}
outer('inner1', {key:'value'});
答案 1 :(得分:1)
在不改变整体结构的情况下eval
似乎是唯一的选择:
function outer(funcName, obj) {
var func = eval(funcName);
func(obj);
function inner1(obj) {
alert(obj.key);
}
}
没有什么特别的"邪恶"约eval
,只要您完全控制代码,但如果需要,可以插入额外的安全检查:
if (funcName.match(/\W/))
throw "invalid function name!";
var func = eval(funcName);
如果有人试图传递除简单标识符之外的任何内容,即函数名称,则会引发异常。
答案 2 :(得分:0)
一个简单的switch语句是最不具侵入性的。或者功能名称是否完全动态?
function outer(innerFunction, obj) {
switch (innerFunction) {
case "inner1": inner1(obj); break;
}
function inner1(obj) {
alert(obj.key);
}
}
outer('inner1', {key:'value'});