2012-07-02 46 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