Javascript 如果我给你一个函数的引用,你能得到函数的名称吗?

Javascript 如果我给你一个函数的引用,你能得到函数的名称吗?,javascript,actionscript-3,flash,Javascript,Actionscript 3,Flash,我正在编写调试工具,我想明确我的位置。我的理想输出是将类名和函数名写入控制台,如下所示: Vehicle.addWheels() Wheels were added by the user 在代码中,它是一个类似于: trace(addWheels, "Wheels were added by the user"); 我正在考虑编写一个自定义函数,以获得如下详细信息(伪代码): 这是一个AS3示例,但AS3是基于JavaScript的,所以如果它在JavaScript中工作,那么它可能在

我正在编写调试工具,我想明确我的位置。我的理想输出是将类名和函数名写入控制台,如下所示:

Vehicle.addWheels()
  Wheels were added by the user
在代码中,它是一个类似于:

trace(addWheels, "Wheels were added by the user");
我正在考虑编写一个自定义函数,以获得如下详细信息(伪代码):

这是一个AS3示例,但AS3是基于JavaScript的,所以如果它在JavaScript中工作,那么它可能在ActionScript中工作

如果这不起作用,我可以使用第三个参数轻松地传递类引用,但仍然需要知道如何获取函数名

public static myTrace(object:Object, function:Function, message:String):void {
   var className:String = getQualifiedName(object);
   var functionName:String = getQualifiedName(function.prototype);
   trace(className + "." + functionName + ": " + message);
}

如果我使用error.getStackTrace(),我可以使用以下方法获取当前类的名称、方法、文档、文档文件路径和行号。文档、文件路径和行号在发布版本中不可用。这仅适用于FP 11.4之后的版本

protected function drawLayer_clickHandler(event:MouseEvent):void
{
    var stack:Array = getStackArray();
    var object:Object = getCurrentLocation();
    var className:Object = getCurrentClassName();
    var functionName:Object = getCurrentFunctionName();

}

protected static function getStackTrace(removeLines:Boolean = true):String {
    var error:Error = new Error();
    var value:String;
    var stackTrace:Array;

    if ("getStackTrace" in error) {
        value = error.getStackTrace();
        value = value.replace(/\t/g, "");
        if (removeLines) {
            value = value.replace(/\[.*\]/g, "");
            value = value.replace(/.*?::/g, "");
        }
        stackTrace = value.split("\n");
        stackTrace.shift();
        stackTrace.shift();
        return stackTrace.join("\n");
    }

    return null;
}

protected static function getCurrentClassName():String {
    var object:Object = getCurrentLocation(2);
    var className:String = object ? object.className: null;

    return className;
}

protected static function getCurrentFunctionName():String {
    var object:Object = getCurrentLocation(2);
    var functionName:String = object ? object.functionName: null;

    return functionName;
}

public static function getCurrentLocation(offset:int = 1):Object {
    var stack:Array = getStackArray(1, offset);
    var object:Object = stack && stack.length ? stack[0] : null;

    return object;
}

protected static function getStackArray(results:int = 0, offset:int = 0):Array {
    var error:Error = new Error();
    var value:String;
    var stackTrace:Array;
    var object:Object;
    var className:String;
    var functionName:String;
    var fileLocation:String;
    var lineNumber:String;
    var message:String;
    var components:Object;
    var matchPattern:RegExp;
    var path:String;
    var stack:Array;
    var locations:Array;

    matchPattern = /^at\s(.+?)\(\)\[(.*?):(.*)]/;

    if ("getStackTrace" in error) {
        value = error.getStackTrace();
        value = value.replace(/\t/g, "");
        //value = value.replace(/\[.*\]/g, "");
        //value = value.replace(/.*?::/g, "");
        stackTrace = value.split("\n");
        stackTrace.shift();// removes Error at
        stackTrace.shift(); // removes this function

        for (; offset >0 && stackTrace.length; offset--) {
            stackTrace.shift();
        }

        stack = [];

        for (var i:int = 0; i < stackTrace.length; i++) {
            object = {};
            message = stackTrace[i];
            components = message.match(matchPattern);

            // matches 
            // "at TransformTests/drawLayer_clickHandler()[/Documents/Project/src/TransformTests.mxml:244]"
            if (components) {
                locations = components[1].split(/[\\|\/]/);

                // class and method
                if (locations.length>1) {
                    object.className = locations[0];
                    object.functionName = locations[1];
                }
                // global method - has no class
                else if (locations.length) {
                    object.functionName = locations[0];
                }

                path = components[2];

                object.location = path;
                object.document = path ? path.split(/[\\|\/]/).pop() : null;
                object.lineNumber = components[3];
                stack.push(object);
            }
            else {
                // matches "at Transform/drawLayer_clickHandler()" or "at drawLayer_clickHandler()"
                components = message.match(/^at\s(.*)\(\)/);

                // runtime has no file path or line number
                if (components) {
                    path = components[1];
                    locations = path.split(/[\\|\/]/);

                    // class and method
                    if (locations.length>1) {
                        object.className = locations[0];
                        object.functionName = locations[1];
                    }
                    // global method - no class
                    else if (locations.length) {
                        object.functionName = locations[0];
                    }

                    stack.push(object);
                }

            }

            if (results==i+1) {
                break;
            }
        }

        return stack;
    }

    return null;
}

getCurrentLocation()返回一个包含类名、方法名的对象,如果在内容调试器中运行,则返回文档、文档路径和行号

如果我使用error.getStackTrace(),我可以使用以下方法获取当前类的名称、方法、文档、文档文件路径和行号。文档、文件路径和行号在发布版本中不可用。这仅适用于FP 11.4之后的版本

protected function drawLayer_clickHandler(event:MouseEvent):void
{
    var stack:Array = getStackArray();
    var object:Object = getCurrentLocation();
    var className:Object = getCurrentClassName();
    var functionName:Object = getCurrentFunctionName();

}

protected static function getStackTrace(removeLines:Boolean = true):String {
    var error:Error = new Error();
    var value:String;
    var stackTrace:Array;

    if ("getStackTrace" in error) {
        value = error.getStackTrace();
        value = value.replace(/\t/g, "");
        if (removeLines) {
            value = value.replace(/\[.*\]/g, "");
            value = value.replace(/.*?::/g, "");
        }
        stackTrace = value.split("\n");
        stackTrace.shift();
        stackTrace.shift();
        return stackTrace.join("\n");
    }

    return null;
}

protected static function getCurrentClassName():String {
    var object:Object = getCurrentLocation(2);
    var className:String = object ? object.className: null;

    return className;
}

protected static function getCurrentFunctionName():String {
    var object:Object = getCurrentLocation(2);
    var functionName:String = object ? object.functionName: null;

    return functionName;
}

public static function getCurrentLocation(offset:int = 1):Object {
    var stack:Array = getStackArray(1, offset);
    var object:Object = stack && stack.length ? stack[0] : null;

    return object;
}

protected static function getStackArray(results:int = 0, offset:int = 0):Array {
    var error:Error = new Error();
    var value:String;
    var stackTrace:Array;
    var object:Object;
    var className:String;
    var functionName:String;
    var fileLocation:String;
    var lineNumber:String;
    var message:String;
    var components:Object;
    var matchPattern:RegExp;
    var path:String;
    var stack:Array;
    var locations:Array;

    matchPattern = /^at\s(.+?)\(\)\[(.*?):(.*)]/;

    if ("getStackTrace" in error) {
        value = error.getStackTrace();
        value = value.replace(/\t/g, "");
        //value = value.replace(/\[.*\]/g, "");
        //value = value.replace(/.*?::/g, "");
        stackTrace = value.split("\n");
        stackTrace.shift();// removes Error at
        stackTrace.shift(); // removes this function

        for (; offset >0 && stackTrace.length; offset--) {
            stackTrace.shift();
        }

        stack = [];

        for (var i:int = 0; i < stackTrace.length; i++) {
            object = {};
            message = stackTrace[i];
            components = message.match(matchPattern);

            // matches 
            // "at TransformTests/drawLayer_clickHandler()[/Documents/Project/src/TransformTests.mxml:244]"
            if (components) {
                locations = components[1].split(/[\\|\/]/);

                // class and method
                if (locations.length>1) {
                    object.className = locations[0];
                    object.functionName = locations[1];
                }
                // global method - has no class
                else if (locations.length) {
                    object.functionName = locations[0];
                }

                path = components[2];

                object.location = path;
                object.document = path ? path.split(/[\\|\/]/).pop() : null;
                object.lineNumber = components[3];
                stack.push(object);
            }
            else {
                // matches "at Transform/drawLayer_clickHandler()" or "at drawLayer_clickHandler()"
                components = message.match(/^at\s(.*)\(\)/);

                // runtime has no file path or line number
                if (components) {
                    path = components[1];
                    locations = path.split(/[\\|\/]/);

                    // class and method
                    if (locations.length>1) {
                        object.className = locations[0];
                        object.functionName = locations[1];
                    }
                    // global method - no class
                    else if (locations.length) {
                        object.functionName = locations[0];
                    }

                    stack.push(object);
                }

            }

            if (results==i+1) {
                break;
            }
        }

        return stack;
    }

    return null;
}

getCurrentLocation()返回一个包含类名、方法名的对象,如果在内容调试器中运行,则返回文档、文档路径和行号

我希望这是有帮助的@payamsbr谢谢!我希望这是有帮助的@payamsbr谢谢!
log();
log("message");
logTarget(object, "message");
getCurrentClassName();
getCurrentFunctionName();
getCurrentLocation();
getStackArray();