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



我正在尝试访问下面简单函数中的arguments.callee属性,但由于该函数抛出错误,我无法访问。

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

为什么会这样?似乎该函数在严格模式下运行,但这怎么可能,因为我没有提到语句'use strict';

我在 Chrome 上运行这个。

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

请参阅有关FunctionDeclarationInstance的注释:

映射的参数对象仅为没有 rest 参数、任何参数默认值初始值设定项或任何非结构化参数的非严格函数提供。

除了不再有.callee之外,它也没有反映对参数变量的赋值(这总是相当令人惊讶的,请参阅 JavaScript:为什么更改参数变量会更改"参数"数组"?或使用参数数组更改 JavaScript 函数的参数值不起作用)。

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

最新更新