我有这段代码:
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
}
});
}
我想要的是de error scoope里面的警告显示了函数名,在本例中是“MyFunction”,而是我得到的是错误:function。
我怎样才能做到这一点?
答案 0 :(得分:18)
这 -
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
将为您提供对调用函数的引用,而不是字符串中的函数名称。
答案 1 :(得分:6)
你想要的是arguments.callee.name
但是在你的情况下,上下文中的函数不再是MyFunction
,而是匿名方法被声明为错误处理程序......
答案 2 :(得分:4)
在严格模式下,您不能再引用被叫方(请参阅Javascript: is the arguments array deprecated?处的相关讨论),因此@Sayem的答案仅在您未使用严格模式时才有效。通常,您希望调用严格模式,因为它有利于您的代码的可靠性(请参阅@JohnResig article)。
我仍然希望有一种方法来引用当前函数的名称,仅用于出现带有上下文的throw错误消息。例如。
抛出myFunctionName()+':无效数量的参数';
现在我必须在throws中对函数名进行硬编码。我已经移动了代码并忘记更新硬编码的函数名称。
我已经考虑过有一个THIS_FUNCTION_NAME =' foobar'作为在函数头部定义的const,但当然可以移动而不是更新。
我想只要你有一个可以从投掷中获得的堆栈跟踪就没有意义。
答案 3 :(得分:3)
通过新答案刷新此帖子的时间:)
使用 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');
Google Chrome控制台(版本:47.0.2526.106 m):
您可以找到所需的所有日志记录功能here
HTH
答案 4 :(得分:1)
您在错误功能范围内使用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
}
});
}
这是你的意思吗?
答案 5 :(得分:-1)
alert('MyFunction');
你做得比可靠做得好,因为那个函数几乎与错误处理程序无关:错误处理程序很可能完全是在另一个上下文中创建的,一个包含MyFunction
,或传入它等。
MyFunction
不会调用处理程序,因此查询arguments.*
无济于事。
您可以将值注入范围:
function MyFunction(){
var _injectedFunctionName = arguments.callee.name;
...
// inside the error handler
alert(_injectedFunctionName);
...
}
虽然假设没有相同名称的值会发生碰撞(在许多情况下是合理的假设,而在其他情况下则不合理)。
您想要函数名称的事实可能是您错误地考虑问题的一个很好的迹象。也许如果你更广泛地解释你想要做什么,社区可以提出替代方案。
答案 6 :(得分:-2)
尝试
error:function(xhr){
alert('Error: '+xhr.status+' '+xhr.statusText);
}