2010-12-27 4 views
3

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

(function() 
{ 
    var cls = function() 
    { 
     this.foo = function() 
     { 
      console.log(arguments.callee.caller); // null 
      foo1(); 
     } 

     var foo1 = function() 
     { 
      console.log(arguments.callee.caller); // foo 
      foo2(); 
     } 

     var foo2 = function() 
     { 
      console.log(arguments.callee.caller); // foo1 
      cls.foo(); // local 
     } 

     var cls = 
     { 
      foo : function() 
      { 
       console.log(arguments.callee.caller); // cls.foo2 
      } 
     } 
    } 
    return (window.cls = cls); 
})(); 

var c1 = new cls(); 
c1.foo(); 

ответ

3

Правильно - они анонимные. Если вам нужно узнать их имена по вызову, вам нужно будет дать им имя. Будет ли что-то вроде this.foo = function foo(), а не this.foo = function() для вас?

+0

Я связываюсь, чтобы выяснить трассировку стека функций в jQuery. – anjanesh

+2

Именованные функциональные выражения, которые вы предлагаете, имеют серьезные проблемы в IE. См. Статью kangax: http://kangax.github.com/nfe/ –

+0

Как это можно сделать, если невозможно переименовать анонимную функцию? –

1

В последних версиях Chrome и Firefox это возможно следующим образом. Я рекомендую это только для целей отладки (например, трассировка javascript в непроизводственных целях)

var mystery = function() { 
    var myNameInChrome = /.*Object\.(.*)\s\(/.exec(new Error().stack)[1]; 
    var myNameInFF = new Error().stack.split("@")[0]; 
} 
+0

Я думаю, что в случае myNameInChrome он должен быть индексом 1, чтобы получить имя функции. Индекс 0 дает полностью согласованную линию регулярных выражений. –

+0

спасибо, обновлен ответ – Lightbeard

+0

Это дает мне имя пространства имен, которое принадлежит моей функции, а не вызывающего. Хороший ответ. –

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