Подтвердить что ты не робот

Получить текущее имя функции в javascript

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

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
        }
    });
}

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

Как я могу это достичь?

4b9b3361

Ответ 1

Это -

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 объект. Он не относится к объекту MyFunction arguments. Вот почему вы получаете error:MyFunction. Использование глобальной переменной в этом случае обеспечивает обходной путь к этой проблеме.

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

Ответ 2

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

Ответ 3

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

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

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

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

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

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

Ответ 4

Время обновления этой темы новым ответом:)

Используйте 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 (версия: 43.0.1)


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

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

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

НТН

Ответ 5

Вы используете 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
        }
    });
}

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


Ответ 6

alert('MyFunction');

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

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

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

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

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

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

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

Ответ 7

Попробуйте

            error:function(xhr){
              alert('Error: '+xhr.status+' '+xhr.statusText);
            }