0

在现有的实现中(不能改变太多的结构),我试图调用一个嵌套在另一个函数中的函数:

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 is evil';)

我想出的另一个解决方案是检查 innerFunction 字符串,但这意味着我必须知道存在哪些内部函数(此外,添加新函数意味着必须编写额外的检查):

if(innerFunction == 'inner1') inner1(obj);

那么在不改变整体实现的情况下还有另一种方法吗?

4

3 回答 3

1

这是你想要的吗?

function outer(innerFunction, obj) {

    var fn = {
        inner1: function (obj) {
            alert(obj.key);
        } 
    };

    fn[innerFunction](obj);
}

outer('inner1', {key:'value'});

http://jsfiddle.net/tbyyw/1/

于 2012-07-02T20:38:42.917 回答
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);

如果有人试图传递除简单标识符(即函数名)以外的任何其他内容,这将引发异常。

于 2012-07-02T21:17:46.710 回答
0

一个简单的 switch 语句将是最少干扰的。或者函数名称是完全动态的?

function outer(innerFunction, obj) {

     switch (innerFunction) {
        case "inner1": inner1(obj); break;            
    }

    function inner1(obj) {
        alert(obj.key);
    }
}
outer('inner1', {key:'value'});
​
于 2012-07-02T20:42:38.243 回答