javascript:嵌套函数的动态调用

javascript:嵌套函数的动态调用,javascript,dynamic,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'}); JSFIDLE在这里:

在现有实现中(无法对结构进行太多更改),我尝试调用嵌套在另一个函数中的函数:

function outer(innerFunction, obj) {

    //TODO: call innerFunction here, passing obj as first parameter

    function inner1(obj) {
        alert(obj.key);
    }
}
outer('inner1', {key:'value'});
JSFIDLE在这里:

我一直在考虑使用
eval()
,但我不知道如何传递对象,他们说“eval是邪恶的”;)

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


那么,在不改变整体实现的情况下,还有其他方法吗?

这是您想要的吗

function outer(innerFunction, obj) {

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

    fn[innerFunction](obj);
}

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

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

function outer(innerFunction, obj) {

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

    function inner1(obj) {
        alert(obj.key);
    }
}
outer('inner1', {key:'value'});
​

在不改变整体结构的情况下,
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);

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

这个问题很难回答。最初的实现是什么?整个实现的哪些部分可以更改?从您的代码片段来看,它看起来不像是已经存在的
outer
。实现已经存在,“outer”函数也已经存在(我刚刚更改了标识符以简化事情)我在问题中已经提到过这一点(使用“if”语句而不是“switch”),这意味着必须重写“inner”函数,这不是我想要的你只是重新命名它们,不是重写它们。底线是没有局部变量的枚举。所以你有3个选择:1)使用eval。2) switch语句或索引对象。3) 将有问题的变量放入枚举对象中。我认为3是最好的,因为它是最安全的。你是对的,它不是“重写”,我只是不想触及包含内部函数的代码块-无论如何,+1提供了一个可行的解决方案,看起来是最好的选择,感谢你在这里展示了如何使用“eval”传递对象。使用
eval
会严重影响“缩小”功能(压缩)脚本的算法。
if (funcName.match(/\W/))
    throw "invalid function name!";

var func = eval(funcName);