在 JavaScript 中,我们可以使用 arguments.callee
来引用当前正在执行的函数本身。类似地,我们可以使用 arguments.callee.caller
引用当前函数的调用者。但是,使用 arguments.callee.caller
有一些问题,使其成为不推荐使用的特性。
问题一:严格模式下被禁用
在 ES5 的严格模式下,arguments.callee.caller
被禁止使用。这是因为严格模式下禁用了许多引起混淆和错误的特性,以提高代码质量和安全性。如果你要编写符合标准并且可移植的代码,那么最好避免使用 arguments.callee.caller
。
问题二:性能问题
由于 arguments.callee.caller
可以让我们获取当前函数的调用者,所以它需要在每次函数调用时遍历整个调用栈,以查找调用该函数的函数。这会导致性能问题,并降低程序的运行速度。因此,在性能要求较高的情况下,最好避免使用 arguments.callee.caller
。
指导意义:
替代方案:
如果想要获取当前函数的调用者,可以使用 Error().stack
方法来获取调用栈信息。例如:
-- -------------------- ---- ------- -------- ----- - --------------------------- - -------- ----- - ------ - ------
输出结果如下:
Error at foo (file:///path/to/file.js:2:11) at bar (file:///path/to/file.js:6:3) at file:///path/to/file.js:8:1
这样就可以获取到当前函数的调用栈信息,而不需要使用 arguments.callee.caller
。
示例代码:
-- -------------------- ---- ------- ---- -------- -------- ----- - -- ------------- - ---------------- -- ------ -- - ----------- - ---- - ---------------- -- ------ ---- ----------------- - - -------- ----- - ------ - ------ -- ------- --- -- ------ -- - -------- ------ -- ------- --- -- ------ -- ---
在上面的示例中,我们定义了两个函数 foo()
和 bar()
。foo()
使用 foo.caller
来判断是否有调用它的函数,并输出相应的信息。我们首先调用 foo()
,输出结果为 foo is called as a function
。接着我们调用 bar()
,由于 bar()
调用了 foo()
,所以输出结果为 foo is called by bar
。
注意,在严格模式下,foo.caller
会返回 null
,因此不能用来检查是否有调用者。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/9061