2013-03-28 80 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