为什么不推荐使用arguments.callee.caller?

阅读时长 3 分钟读完

在 JavaScript 中,我们可以使用 arguments.callee 来引用当前正在执行的函数本身。类似地,我们可以使用 arguments.callee.caller 引用当前函数的调用者。但是,使用 arguments.callee.caller 有一些问题,使其成为不推荐使用的特性。

问题一:严格模式下被禁用

在 ES5 的严格模式下,arguments.callee.caller 被禁止使用。这是因为严格模式下禁用了许多引起混淆和错误的特性,以提高代码质量和安全性。如果你要编写符合标准并且可移植的代码,那么最好避免使用 arguments.callee.caller

问题二:性能问题

由于 arguments.callee.caller 可以让我们获取当前函数的调用者,所以它需要在每次函数调用时遍历整个调用栈,以查找调用该函数的函数。这会导致性能问题,并降低程序的运行速度。因此,在性能要求较高的情况下,最好避免使用 arguments.callee.caller

指导意义:

替代方案:

如果想要获取当前函数的调用者,可以使用 Error().stack 方法来获取调用栈信息。例如:

-- -------------------- ---- -------
-------- ----- -
  ---------------------------
-

-------- ----- -
  ------
-

------

输出结果如下:

这样就可以获取到当前函数的调用栈信息,而不需要使用 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

纠错
反馈