Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 匿名函数中的函数调用方名称_Javascript_Anonymous Function - Fatal编程技术网

Javascript 匿名函数中的函数调用方名称

Javascript 匿名函数中的函数调用方名称,javascript,anonymous-function,Javascript,Anonymous Function,我猜在匿名函数中没有办法获得函数调用方的名称,是吗 (function() { var cls = function() { this.foo = function() { console.log(arguments.callee.caller); // null foo1(); } var foo1 = function() {

我猜在匿名函数中没有办法获得函数调用方的名称,是吗

(function()
{
    var cls = function()
    {
        this.foo = function()
        {
            console.log(arguments.callee.caller); // null
            foo1();
        }

        var foo1 = function()
        {
            console.log(arguments.callee.caller); // foo
            foo2();
        }

        var foo2 = function()
        {
            console.log(arguments.callee.caller); // foo1
            cls.foo(); // local
        }

        var cls =
        {
            foo : function()
            {
                console.log(arguments.callee.caller); // cls.foo2
            }
        }
    }
    return (window.cls = cls);
})();

var c1 = new cls();
c1.foo();

正确-他们是匿名的。如果你需要通过被叫人知道他们的名字,你需要给他们一个名字。类似于
this.foo=function foo()
而不是
this.foo=function()
这样的东西对你有用吗?

在Chrome和Firefox的最新版本中可能会出现如下情况。我只建议用于调试目的(例如非生产环境中的javascript跟踪)


我打算在jQuery中找出一个函数堆栈跟踪。您建议的命名函数表达式在IE中存在严重问题。请参阅kangax的文章:在无法重命名匿名函数的情况下,如何做到这一点?我认为在myNameInChrome的情况下,应该使用索引1来获取函数名。索引0提供完全匹配的正则表达式行。这将提供函数所属命名空间的名称,而不是调用方的名称。回答得不错。Rutwick我更新了代码示例。您是否在如图所示的匿名函数中尝试过它?我的chrome浏览器为其错误()输出此命令。堆栈(JSONified):
“错误\n在神秘(:4:27)\n在:1:1”
这在chrome中工作得更好:
var mystery = function() {
   var myNameInChrome = /.*Object\.(.*)\s\(/.exec(new Error().stack)[1];
   var myNameInFF = new Error().stack.split("@")[0];
}