2013-03-28 77 views
1

通常的名稱的字符串,如果我有包含函數的名稱的字符串,我可以做類似...的JavaScript - 包含函數

window[functionName](arguments); 

然而,在使用時無法正常工作「jQuery對象」風格的編程(或任何正確的術語)。例如;

(function ($) { 
    "use strict"; 
    $.test = (function() { 
     var func1 = function() { 
      alert("func1"); 
     }; 

     var func2 = function() { 
      alert("func2"); 
     }; 

     return { 
      Test: function (functionName) { 
       var fn = window[functionName]; // Need to specify scope here, somehow 
       if (typeof fn === 'function') { 
        fn(); 
       } else { 
        alert("fn() = " + fn); 
       } 
      } 
     } 

    }()); 
} (jQuery)); 

$.test.Test("func1"); 
$.test.Test("func2"); 

理想,這將顯示FUNC1其次FUNC2 - 但顯然作用域是錯誤的,我不知道如何表明它在這種情況下。

如何在這種情況下指定函數的範圍?我當然可以使用eval(),但我試圖避免這種情況...

謝謝。

+1

@ AndyE的答案是正確的,但供大家參考,這「jQuery對象風格」沒有一個*官方*項,而是一個使用立即調用的函數表達式創建的閉包(例如,詞法作用域)的示例。 – Xophmeister 2013-03-28 11:17:38

回答

4

使用對象映射到房子的功能來代替:

var funcs = { 
     func1: function() { 
      alert("func1"); 
     }, 
     func2: function() { 
      alert("func2"); 
     } 
    }; 

    return { 
     Test: function (functionName) { 
      var fn = funcs[functionName]; 
      if (typeof fn === 'function') { 
       fn(); 
      } else { 
       alert("fn() = " + fn); 
      } 
     } 
    }; 
+0

謝謝;後見之明,但我正在走錯錯誤的範圍衚衕! – gdt 2013-03-29 15:59:15