получить текущее имя функции в JavaScript - PullRequest
16 голосов
/ 05 июля 2011

У меня есть этот кусок кода:

function MyFunction()
{
    $.ajax({
        type: "POST",
        url: "ajax.php",
        dataType: "json",
        data: "foo=bar",
        error:function(XMLHttpRequest, textStatus, errorThrown)
        {
            alert(arguments.callee);
        },
        success: function(jsonObject)
        {
            //do something
        }
    });
}

я хочу, чтобы предупреждение внутри scoope de error показывало имя функции, в данном случае «MyFunction», но вместо этого я получаю error: function.

Как мне этого добиться?

Ответы [ 7 ]

18 голосов
/ 05 июля 2011

Это -

var my_arguments;

function MyFunction() {
    my_arguments = arguments;

    $.ajax({
        type: "POST",
        url: "http://www.google.com",
        dataType: "json",
        data: "foo=bar",
        error:function(XMLHttpRequest, textStatus, errorThrown) {
            alert(my_arguments.callee.name);
        },
        success: function(jsonObject) {
            //do something
        }
    });
}

- это то, что вам нужно.

arguments внутри функции error относится к собственному объекту arguments этого метода.Это не относится к объекту arguments MyFunction.Вот почему вы получаете error:MyFunction.Использование глобальной переменной в этом случае предоставляет обходной путь для этой проблемы.

Кроме того, чтобы получить только имя функции, вам необходимо использовать arguments.callee.name.arguments.callee даст вам ссылку на вызывающую функцию, а не имя функции в строке.

6 голосов
/ 05 июля 2011

То, что вы хотите, это arguments.callee.name однако в вашем случае функция в контексте больше не MyFunction, а анонимный метод, объявленный в качестве обработчика ошибок ...

4 голосов
/ 29 марта 2014

В строгом режиме вы больше не можете ссылаться на вызываемого абонента (см. Соответствующее обсуждение на Javascript: массив аргументов устарел? ), поэтому ответ от @Sayem действителен, только если вы не используете строгийРежим.В общем, вы хотите вызвать строгий режим из-за его преимуществ для надежности вашего кода (см. @ JohnResig article ).

Я все еще хотел бы иметь возможность ссылаться на имя текущегоФункция только для целей выбросить сообщения об ошибках с контекстом.Например,

throw myFunctionName () + ': недопустимое количество аргументов';

Сейчас мне нужно жестко закодировать имя функции в пределах throws.Я переместил код и забыл обновить жестко запрограммированные имена функций.

Я думал о соглашении о кодировании, согласно которому THIS_FUNCTION_NAME = 'foobar' в качестве const определяется в начале функции, но, конечно, он также может быть перемещен и не обновлен.

Полагаю, до тех пор, пока у вас есть стековая трассировка от броска, точка спорна.

3 голосов
/ 23 января 2016

Время обновить эту тему новым ответом:)

Использовать console.trace ();

Просто вызовите console.trace () иFirebug запишет очень информативную трассировку стека в консоль.Он не только скажет вам, какие функции находятся в стеке, но также будет включать в себя значение каждого аргумента, который был передан каждой функции.Вы можете щелкнуть функции или объекты для их дальнейшей проверки.

JavaScript Пример:

function fn1(arg1, arg2) {
    var arg3 = 'myArg3';
    fn2(arg1, arg2, arg3);
}
function fn2(arg1, arg2, arg3) {
    var obj = {
        attr1 : 'val1',
        attr2 : 'val2'
    };
    console.trace(obj);
}
fn1('myArg1', 'myArg2', 'myArg3');

Консоль Firefox (версия: 43.0.1):Firefox console (version: 43.0.1)

Консоль Google Chrome (версия: 47.0.2526.106 м):Google Chrome console (version: 47.0.2526.106 m)

Вы можете найти здесь все необходимые функции регистрации

HTH

1 голос
/ 05 июля 2011

Вы используете arguments в области действия функции ошибки. Вам нужно что-то вроде этого, если вы хотите arguments MyFunction ():

function MyFunction()
{
    var myfunction_arguments = arguments;

    $.ajax({
        type: "POST",
        url: "ajax.php",
        dataType: "json",
        data: "foo=bar",
        error:function(XMLHttpRequest, textStatus, errorThrown)
        {
            alert(myfunction_arguments.callee);
        },
        success: function(jsonObject)
        {
            //do something
        }
    });
}

Это то, что вы имеете в виду?


0 голосов
/ 05 июля 2011
alert('MyFunction');

Вы не можете работать лучше, чем надежно, так как эта функция почти не имеет ничего общего с обработчиком ошибок: очень вероятно, что обработчик ошибок может быть создан в другом контексте полностью, включая MyFunction, или передан

MyFunction не вызывает обработчик, поэтому запрос arguments.* не поможет.

Вы можете вставить значение в область действия:

function MyFunction(){
   var _injectedFunctionName = arguments.callee.name;

   ...
   // inside the error handler
   alert(_injectedFunctionName);
   ...
}

Хотя это предполагает, что никакое значение с тем же именем не будет конфликтовать (разумное предположение во многих случаях и не слишком разумное в других).

Тот факт, что вы хотите, чтобы имя функции, вероятно, является хорошимпризнак того, что вы думаете о проблеме неправильно.Возможно, если вы объясните, что вы пытаетесь сделать более широко, сообщество может предложить альтернативы.

0 голосов
/ 05 июля 2011

Попробуйте

            error:function(xhr){
              alert('Error: '+xhr.status+' '+xhr.statusText);
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...