2012-07-01 3 views
8

Для следующего скрипта, как я могу написать функцию, которая возвращает все функции скрипта в виде массива? Я хотел бы вернуть массив функций, определенных в скрипте, чтобы я мог распечатать сводку каждой функции, определенной в скрипте.Возврат всех функций, определенных в файле Javascript

function getAllFunctions(){ //this is the function I'm trying to write 
     //return all the functions that are defined in the script where this 
     //function is defined. 
     //In this case, it would return this array of functions [foo, bar, baz, 
     //getAllFunctions], since these are the functions that are defined in this 
     //script. 
    } 

    function foo(){ 
     //method body goes here 
    } 

    function bar(){ 
     //method body goes here 
    } 

    function baz(){ 
     //method body goes here 
    } 
+0

Чтобы уточнить, getAllFunctions() следует только повторно включите функции, определенные в самом скрипте, и ничего больше. –

+0

Я уточнил исходный вопрос, чтобы вопрос уже не был двусмысленным. –

+0

Посмотреть это сообщение http://stackoverflow.com/questions/493833/list-of-global-user-defined-functions-in-javascript – anazimok

ответ

9

Объявляет его в псевдо пространство имен, например так:

var MyNamespace = function(){ 
    function getAllFunctions(){ 
     var myfunctions = []; 
     for (var l in this){ 
     if (this.hasOwnProperty(l) && 
      this[l] instanceof Function && 
      !/myfunctions/i.test(l)){ 
      myfunctions.push(this[l]); 
     } 
     } 
     return myfunctions; 
    } 

    function foo(){ 
     //method body goes here 
    } 

    function bar(){ 
     //method body goes here 
    } 

    function baz(){ 
     //method body goes here 
    } 
    return { getAllFunctions: getAllFunctions 
      ,foo: foo 
      ,bar: bar 
      ,baz: baz }; 
    }(); 
    //usage 
    var allfns = MyNamespace.getAllFunctions(); 
    //=> allfns is now an array of functions. 
    // You can run allfns[0]() for example 
+1

+1 по праву захвата функции, я считаю, что я видел подобный путь в ** Тайны Резиг в JavaScript из Ninja ** книга – Blaster

+0

Это работает, но это, кажется, немного излишним: возврата {getAllFunctions: getAllFunctions , Foo: Foo , бар: бар , baz: baz}; Можно ли это сделать без жесткого кодирования имени каждой функции? –

+0

@ Андерсон: вам нужна ссылка на сами функции, но она не должна быть общедоступной. В качестве альтернативы вы можете назначить объект типа 'var fns = {foo: foo, bar: bar ...}' variable в 'MyNamespae' и запросить использование' getAllFunctions'. Если вам нужно только открыть 'getAllFunctions' ->' return {getAllfunctions: getAllfunctions}; ' – KooiInc

10

Вот функция, которая будет возвращать все функции, определенные в документе, что он делает это перебирает все объекты/элементы/функции и отображают только те, чьи тип «функция».

function getAllFunctions(){ 
     var allfunctions=[]; 
      for (var i in window) { 
     if((typeof window[i]).toString()=="function"){ 
      allfunctions.push(window[i].name); 
      } 
     } 
    } 

Вот jsFiddle working demo

+0

Проблема с это то, что он поймает все функции, определенные в предыдущих сценариях, которые были прикреплены к окну. И это очень плохая идея, чтобы бросить вещи в окно в первую очередь. –

+2

Добавление '&& window [i] .toString(). IndexOf (" native ") == - 1' к исправлениям if. –

1

function foo(){/*SAMPLE*/} 
 
function bar(){/*SAMPLE*/} 
 
function www_WHAK_com(){/*SAMPLE*/} 
 

 
for(var i in this) { 
 
\t if((typeof this[i]).toString()=="function"&&this[i].toString().indexOf("native")==-1){ 
 
\t \t document.write('<li>'+this[i].name+"</li>") 
 
\t } 
 
}

Смежные вопросы