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

在 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


猜你喜欢

  • 如何在浏览器窗口中关闭当前选项卡?

    在开发 Web 应用程序时,我们经常需要与浏览器窗口进行交互。其中一个常见的需求是在前端代码中关闭当前选项卡。本文将介绍几种方法来实现这一目标,并提供示例代码和深入讨论。

    7 年前
  • 什么浏览器支持HTML5 WebSocket API吗?

    WebSocket是一种在单个TCP连接上提供双向通信的协议。它允许服务器主动将数据推送到客户端,而不需要客户端使用轮询来请求信息。HTML5引入了WebSocket API作为WebSockets的...

    7 年前
  • 使用字符串键访问嵌套的JavaScript对象

    当我们需要操作一个复杂的 JavaScript 对象时,如何快捷地访问其中的属性是一个值得探究的问题。本文将介绍一种使用字符串键来访问嵌套的 JavaScript 对象的方法,并提供相关示例代码和指导...

    7 年前
  • 为什么改变和顺序返回一个不同的结果?

    在前端开发中,我们常常需要对数组进行排序。然而,有时候改变排序的方式或者顺序却会导致不同的结果。这是因为在 JavaScript 中,排序的方法可能会受到数据类型、字母大小写等因素的影响。

    7 年前
  • 我总是被“捕获syntaxerror:意外的标记”

    前端开发中,我们经常会遇到语法错误的问题。其中一个最常见的错误就是“捕获syntaxerror:意外的标记”。这个错误通常代表了一些在代码中不应该出现的字符或者符号。

    7 年前
  • Twitter引导选项卡:转到页面重载或超级链接的特定选项卡

    Twitter 引导选项卡是一种常见的网站功能,它允许用户在单个页面上访问多个相关页面。用户可以通过点击选项卡来切换不同的页面内容。在本文中,我们将深入介绍如何使用 HTML、CSS 和 JavaSc...

    7 年前
  • 从 AJAX 处理文件下载

    在前端开发中,我们经常需要向服务器请求文件并下载。一种常见的方式是使用 AJAX 技术进行文件下载。本文将详细介绍如何使用 AJAX 实现文件下载,并提供示例代码。

    7 年前
  • 防止 RequireJS 缓存所需的脚本

    在前端开发中,我们经常会使用 RequireJS 来管理项目中的模块。然而,当我们更新了一个模块的代码后,可能会出现浏览器缓存导致无法及时加载最新代码的问题。本文将介绍如何防止 RequireJS 缓...

    7 年前
  • 如何在JavaScript中获得两个日期之间的天数?

    计算两个日期之间的天数是Web开发中常见的任务,例如在网站上显示商品的剩余天数或者计算某个事件发生的天数。在JavaScript中,我们可以使用内置的Date对象和一些简单的算法来实现这个功能。

    7 年前
  • 将JavaScript日期初始化到午夜的最佳方式

    在前端开发中,我们会经常遇到需要对时间进行处理的场景。在某些情况下,我们需要将一个日期对象初始化为午夜(即0时0分0秒)。本文将讨论如何以最佳方式实现这一功能。 Date 对象 在 JavaScrip...

    7 年前
  • jQuery按类计算元素

    在前端开发中,我们常常需要对DOM元素进行操作和计算。其中,按类计算元素是一项常见的任务,它可以帮助我们快速地获取某个类下的所有元素,并进行进一步的处理。 在这篇文章中,我们将介绍如何使用jQuery...

    7 年前
  • 避免列表循环结构转换到 JSON 中的问题

    在前端开发过程中,我们通常需要将数据从 JavaScript 对象转换为 JSON 格式,以便传输给后端或本地存储。其中,JSON.stringify() 方法是最常用的一种方式。

    7 年前
  • jQuery能获得与元素相关联的所有CSS样式吗?

    jQuery是一种广泛使用的前端JavaScript库,它可以帮助我们轻松地操作HTML文档、处理事件和动画等。在开发中,通常需要获取某个元素的CSS属性值,以实现更高级别的交互和动态效果。

    7 年前
  • 调整HTML5画布中的图像大小

    在前端开发中,我们可能需要在HTML5画布上绘制图像,并且需要对这些图像进行缩放操作。本文将介绍如何使用JavaScript调整HTML5画布中图像的大小。 HTML5画布基础 HTML5画布是一个矩...

    7 年前
  • 在数组中获取所有非唯一值(即:重复/多个事件)

    在数组中获取所有非唯一值 在前端开发中,我们常常需要对数据进行统计和分析。其中,一个常见的需求是获取数组中所有的非唯一值,也就是包含重复元素的值。本文将介绍如何使用 JavaScript 实现这个功能...

    7 年前
  • 按引用与按值复制的JavaScript

    在JavaScript中,变量可以按值或引用进行复制。这两种方式会影响到变量的赋值、传递和比较等操作。本文将深入探讨这两种复制方式,并提供相关示例代码。 按值复制 按值复制是指将原始类型(如字符串、数...

    7 年前
  • 我应该什么时候使用花括号为6进口?

    在前端开发中,我们经常会碰到需要处理进制转换的情况。其中一个问题就是在 CSS 中使用颜色值,有时候需要用到 16 进制或者 RGB 值进行表示。但是,在某些特定场景下,我们还需要用到 6 位的进制数...

    7 年前
  • 用 JavaScript 解释美元符号

    在前端开发中,美元符号 $ 是一个常见的字符。除了在美元货币符号中使用外,它还经常出现在前端框架和库(如 jQuery、Angular、React 等)中。 那么,美元符号到底代表什么?能否使用 Ja...

    7 年前
  • 不变的违反 _registerComponent():目标容器不是一个 DOM 元素

    在前端开发中,我们经常会使用 React 这样的框架来构建 Web 应用程序。在使用 React 的过程中,我们可能会遇到一个错误信息:“Invariant Violation: _registerC...

    7 年前
  • 为什么没有数组的IE8及以下浏览器支持?

    随着前端技术的不断发展,新的功能和特性不断涌现。然而,在开发过程中,我们经常会遇到一些老旧的浏览器无法支持的问题。其中,IE8及以下版本对于JavaScript的支持是个大问题,在这些浏览器中,数组存...

    7 年前

相关推荐

    暂无文章