Javascript 从函数本身获取函数名

Javascript 从函数本身获取函数名,javascript,Javascript,可能重复: 我想从函数本身获取函数名 Javascript: Cube : { profile : { edit : function(){ // Get function Path Cube.edit Here alert(arguments.callee.name); // Not Working } } } 代码段中的函数没有名称,它是匿名的。在profile上分配给它的属性有一个名称(ed

可能重复:

我想从函数本身获取函数名

Javascript:

Cube : {
    profile : {
        edit : function(){
            // Get function Path Cube.edit Here
            alert(arguments.callee.name); // Not Working
        }
    }
}

代码段中的函数没有名称,它是匿名的。在
profile
上分配给它的属性有一个名称(
edit
),但函数没有。否,无法从函数对象获取
edit
profile.edit
Cube.profile.edit

您可以为函数指定一个名称:

Cube : {

   profile: {
       edit : function edit(){

         alert(arguments.callee.name);

       }
   }
}
…但这使用的是一个命名函数表达式,它将在IE8和更早版本上创建

您也可以这样做:

Cube : {

   profile: {
       edit : Cube_profile_edit
    }
}
// ...

function Cube_profile_edit(){

    alert(arguments.callee.name);
}
然而,在上述所有情况下,有两个问题:

  • 您使用的是
    参数。被调用方
    ,这在许多浏览器上都非常慢,并且在中无效

  • 函数对象的
    name
    属性是非标准的,这就是为什么可能需要解析
    function\toString
    的结果。问题是,
    Function#toString
    也是非标准的(但除了在移动浏览器上,支持范围相当广泛)


  • 您可以通过在
    多维数据集
    对象图中搜索引用函数的属性来避免第二个问题,但这仍然需要使用
    参数。被调用方
    (除非您为函数指定了实名,然后在搜索时使用该实名来查找指向该函数的属性路径).

    代码段中的函数没有名称,它是匿名的。在
    profile
    上分配给它的属性有一个名称(
    edit
    ),但函数没有。否,无法从函数对象获取
    edit
    profile.edit
    Cube.profile.edit

    您可以为函数指定一个名称:

    Cube : {
    
       profile: {
           edit : function edit(){
    
             alert(arguments.callee.name);
    
           }
       }
    }
    
    …但这使用的是一个命名函数表达式,它将在IE8和更早版本上创建

    您也可以这样做:

    Cube : {
    
       profile: {
           edit : Cube_profile_edit
        }
    }
    // ...
    
    function Cube_profile_edit(){
    
        alert(arguments.callee.name);
    }
    
    然而,在上述所有情况下,有两个问题:

  • 您使用的是
    参数。被调用方
    ,这在许多浏览器上都非常慢,并且在中无效

  • 函数对象的
    name
    属性是非标准的,这就是为什么可能需要解析
    function\toString
    的结果。问题是,
    Function#toString
    也是非标准的(但除了在移动浏览器上,支持范围相当广泛)


  • 您可以通过在
    多维数据集
    对象图中搜索引用函数的属性来避免第二个问题,但这仍然需要使用
    参数。被调用方
    (除非您为函数指定了实名,然后在搜索时使用该实名来查找指向该函数的属性路径).

    你可以把你的函数命名为:
    edit:function edit(){…}
    @Osiris我来回答这个问题。但是我没有得到我的答案<代码>警报(arguments.callee.name)不适用于上面的代码示例。@elclanrs:在IE8和更早版本上创建的。@elclanrs我编辑了有问题的代码。请看。现在我想获取profile.edit()@JavedAkhtar:更改代码只是添加一个进一步的对象层是毫无意义的,它根本不会改变问题,只是会使现有的答案在编辑之前看起来很奇怪。您可以将您的函数命名为:
    edit:function edit(){…}
    @Osiris我将讨论这个问题。但是我没有得到我的答案<代码>警报(arguments.callee.name)不适用于上面的代码示例。@elclanrs:在IE8和更早版本上创建的。@elclanrs我编辑了有问题的代码。请看。现在我想获取profile.edit()@JavedAkhtar:仅仅添加一个对象层来更改代码是毫无意义的,它根本不会更改问题,只是会使现有答案在编辑之前看起来很奇怪。