javascript:嵌套函数的动态调用

时间:2012-07-02 20:31:31

标签: javascript dynamic

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

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);

那么还有另一种方法可以不改变整体实施吗?

3 个答案:

答案 0 :(得分: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/

答案 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'});
​