Получить текущее имя функции в 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:.
Как я могу это достичь?
Ответы
Ответ 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);
}