TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them,如何避免?

在 JavaScript 编程中,经常会遇到 TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them 的错误提示。这个错误提示通常出现在使用严格模式下的函数中,对 arguments 对象进行访问时。

什么是严格模式?

在 JavaScript 中,严格模式是一种特殊的模式,它可以让代码运行更加严格。严格模式下会禁用一些不规范的语法和行为,使得代码更加健壮、可维护和安全。

要启用严格模式,可以在代码的开头添加如下代码:

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

严格模式下 arguments 对象的限制

在严格模式下,函数的 arguments 对象有一些限制。具体来说,arguments 对象不能访问以下属性和方法:

  • arguments.caller
  • arguments.callee
  • arguments.caller.caller
  • arguments.callee.caller
  • arguments.caller.arguments
  • arguments.callee.arguments

这些属性和方法在非严格模式下是可以访问的,但是在严格模式下会抛出 TypeError 错误。

如何避免 TypeError 错误?

为了避免 TypeError 错误,我们可以采用以下两种方法:

1. 使用命名函数表达式

在严格模式下,使用命名函数表达式可以避免 arguments 对象的限制。具体来说,我们可以将函数定义为一个命名函数表达式,并在函数内部使用该函数的名称来递归调用自身。

示例代码如下:

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

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

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

在上面的示例代码中,我们定义了一个命名函数表达式 factorial,使用该函数的名称 fact 来递归调用自身。由于使用了命名函数表达式,因此我们可以在函数内部访问 arguments.callee 属性,避免了 TypeError 错误。

2. 使用函数参数代替 arguments 对象

另一种避免 TypeError 错误的方法是使用函数参数代替 arguments 对象。具体来说,我们可以将函数的参数列表定义为一个数组,然后使用该数组来代替 arguments 对象。

示例代码如下:

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

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

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

在上面的示例代码中,我们定义了一个函数 sum,它的参数列表为一个数组 numbers。在函数内部,我们使用该数组来计算所有数字的和,避免了访问 arguments 对象的限制。

总结

在 JavaScript 编程中,严格模式下的函数访问 arguments 对象时会出现 TypeError 错误。为了避免这种错误,我们可以采用命名函数表达式或使用函数参数代替 arguments 对象的方法。这些方法可以让我们在严格模式下编写更加健壮、可维护和安全的代码。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/660e50efd10417a222ed3f46