是否有可能做到这一点:
myfile.js:
function foo() {
alert(<my-function-name>);
// pops-up "foo"
// or even better: "myfile.js : foo"
}
我的堆栈中有 Dojo 和 jQuery 框架,所以如果它们中的任何一个使它更容易,它们都可用。
是否有可能做到这一点:
myfile.js:
function foo() {
alert(<my-function-name>);
// pops-up "foo"
// or even better: "myfile.js : foo"
}
我的堆栈中有 Dojo 和 jQuery 框架,所以如果它们中的任何一个使它更容易,它们都可用。
在 ES5 及更高版本中,无法访问该信息。
在旧版本的 JS 中,您可以使用arguments.callee
.
不过,您可能需要解析该名称,因为它可能包含一些额外的垃圾。不过,在某些实现中,您可以简单地使用arguments.callee.name
.
解析:
function DisplayMyName()
{
var myName = arguments.callee.toString();
myName = myName.substr('function '.length);
myName = myName.substr(0, myName.indexOf('('));
alert(myName);
}
对于非匿名函数
function foo()
{
alert(arguments.callee.name)
}
但是在错误处理程序的情况下,结果将是错误处理程序函数的名称,不是吗?
您需要的一切都很简单。创建函数:
function getFuncName() {
return getFuncName.caller.name
}
之后,无论何时需要,您只需使用:
function foo() {
console.log(getFuncName())
}
foo()
// Logs: "foo"
根据MDN
警告: ECMAScript (ES5) 第 5 版禁止在严格模式下使用 arguments.callee()。通过给函数表达式一个名称或在函数必须调用自身的地方使用函数声明,避免使用 arguments.callee()。
正如指出的适用只有当你的脚本使用“严格模式”。这主要是出于安全原因,遗憾的是目前没有其他选择。
getMyName
下面片段中的函数返回调用函数的名称。这是一个 hack 并且依赖于非标准功能:Error.prototype.stack
. 请注意,返回的字符串格式Error.prototype.stack
在不同引擎中的实现方式不同,因此这可能不适用于所有地方:
function getMyName() {
var e = new Error('dummy');
var stack = e.stack
.split('\n')[2]
// " at functionName ( ..." => "functionName"
.replace(/^\s+at\s+(.+?)\s.+/g, '$1' );
return stack
}
function foo(){
return getMyName()
}
function bar() {
return foo()
}
console.log(bar())
关于其他解决方案:arguments.callee
在严格模式下是不允许的,Function.prototype.caller
是非标准的,在严格模式下是不允许的。