为什么我无法在这个草率模式函数中访问arguments.callee?

cod*_*boy 3 javascript arguments

我试图访问arguments.callee下面的简单函数中的属性,但我无法访问,因为该函数抛出错误。

function foo(a = 50, b) {
  console.log(arguments.callee);
}

foo(10, 50);
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况?看起来该函数正在严格模式下运行,但是这怎么可能,因为我没有提到该语句'use strict';

我在 Chrome 上运行这个。

Ber*_*rgi 5

arguments如果您在函数声明中使用高级(现代,ES6+)语法,则会像严格模式一样自动创建对象 - 在您的情况下,它是默认参数初始化程序。该函数实际上并不是严格模式 - 例如,您仍然可以with在其中使用语句,但该arguments对象不再向后兼容 ES5 之前的代码。

请参阅FunctionDeclarationInstantiation的注释

映射参数对象仅提供给没有剩余参数、任何参数默认值初始值设定项或任何解构参数的非严格函数。

除了不再有 a 之外.callee,它也不再反映对参数变量的赋值(这总是相当令人惊讶,请参阅JavaScript: Why does moving an argument variablechange the `arguments` "array"?更改 JavaScript 函数的参数值使用参数数组不起作用)。

ES5基本上arguments.callee已弃用,但为了向后兼容,该语言只能在您选择使用现代语法(例如使用严格模式或非简单参数声明)时选择不提供它。