在javascript中获取当前函数名称

时间:2011-07-05 18:11:05

标签: jquery function

我有这段代码:

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。

我怎样才能做到这一点?

7 个答案:

答案 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.namearguments.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');


Firefox控制台(版本:43.0.1):

Firefox console (version: 43.0.1)


Google Chrome控制台(版本:47.0.2526.106 m):

Google Chrome console (version: 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);
            }
相关问题