📅  最后修改于: 2023-12-03 15:37:21.916000             🧑  作者: Mango
在 JavaScript 中找到哪个函数调用了当前函数是一项非常有用的技能。这可以帮助我们快速诊断代码中的错误,并找到需要优化的代码部分。下面是一些方法来找出调用者函数。
JavaScript 的 Error 对象有一个堆栈属性,该属性包含函数调用链的信息。我们可以通过在函数中创建一个 Error 对象并访问其堆栈属性来查找调用者函数。
function getCurrentFunctionCaller() {
return (new Error()).stack.split('\n')[2].trim();
}
function foo() {
console.log(getCurrentFunctionCaller());
}
function bar() {
foo();
}
bar(); // 输出 "at bar"
上面的代码中,我们创建了一个 getCurrentFunctionCaller
函数,该函数通过创建一个 Error 对象并访问其堆栈属性来获取函数调用者的名称。在 foo
函数中,我们调用了 getCurrentFunctionCaller
并将其输出到控制台。
在 bar
函数中,我们调用了 foo
函数,因此 getCurrentFunctionCaller
将返回调用 foo
函数的函数的名称。在这种情况下,它返回 "at bar"。
这种方法的主要优点是它可以简单地从任何 JavaScript 环境中调用,并且可以在任何位置使用。然而,它也有一些缺点,例如:
在早期的 JavaScript 实现中,我们可以使用 arguments.callee.caller
来查找调用当前函数的函数。这种方法已经被淘汰,并且在严格模式下被禁止。然而,仍有一些仍在使用的 JavaScript 引擎仍支持它。它的实现如下:
function getCurrentFunctionCaller() {
return arguments.callee.caller.name;
}
function foo() {
console.log(getCurrentFunctionCaller());
}
function bar() {
foo();
}
bar(); // 输出 "bar"
在这个例子中,我们创建了一个 getCurrentFunctionCaller
函数,它返回当前函数的调用者的名称。在 foo
函数中,我们调用了该函数,并将结果输出到控制台。
在 bar
函数中,我们调用了 foo
函数,因此 getCurrentFunctionCaller
将返回 "bar"。注意,这种方法已经被淘汰,不能在严格模式下使用,并且在将来可能被完全移除。
在 JavaScript 中找到哪个函数调用了当前函数是一项非常有用的技能。在本文中,我们介绍了两种方法来找到调用者函数:使用 Error 对象和 arguments.callee.caller
。然而,在使用这些技术时需要小心,因为它们可能会影响性能,并且可能在不同的 JavaScript 环境中运行不正常。