2012-07-02 22 views
0

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

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/

我已经alreay想过使用eval(),但我不知道如何传递一个对象 - 和他们说“的eval是邪恶的”;)

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

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

那么有没有不改变整体实现另一种方式?

+0

这个问题很难回答。最初的实现是什么,整个实现的哪些部分可以改变?从你的代码片段看,它看起来不像'outer'已经存在。 – user123444555621

+0

这个实现已经存在,'outer'函数也是如此(我刚刚改变了标识符以简化事情) – schellmax

回答

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

这将引发异常:你可以插入一个额外的安全检查标识符,即功能名称。

+0

看起来是最好的选择,谢谢你展示了如何在这里使用'eval'传递一个对象。 – schellmax

+0

使用'eval'会严重影响脚本的'缩小'(压缩)算法。 –

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/

+0

这意味着必须重写'内部'函数,这不是我想要的 – schellmax

+0

你只是重命名它们,不重写它们。底线是没有枚举局部变量。所以你有3个选择:1)使用eval。 2)切换语句或索引对象。 3)将有问题的变量放入枚举对象中。我认为3是最好的,因为它是最安全的。 –

+0

你是对的,它不是'重写',我只是不想触摸包含内部函数的代码块 - 无论如何,+1提供了一个可行的解决方案 – schellmax

0

一个简单的开关语句是不侵扰。或者功能名称是完全动态的?

function outer(innerFunction, obj) { 

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

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

我已经在我的问题中提到过这个使用'if'语句而不是'switch') – schellmax