未声明'use strict'的带默认参数函数访问arguments.callee报错原因
问题原因分析
- 该行为是ES2015(ES6)规范明确定义的默认规则,和是否手动声明
'use strict'没有直接关联。 - 当函数使用了以下任意一种非简约参数语法时,函数内部会自动应用严格模式下对
arguments对象的限制:- 默认参数值(即你代码中用到的
a = 50写法) - 剩余参数(比如
function foo(...args) {}的写法) - 参数解构(比如
function foo({a, b}) {}的写法)
- 默认参数值(即你代码中用到的
- 这类限制包含两条核心规则:
- 禁止访问
arguments.callee、arguments.caller属性,访问时会直接抛出TypeError arguments对象不再和对应形参做动态绑定,修改形参不会同步更新arguments中的值
- 禁止访问
验证示例
你可以将函数参数修改为无默认值的普通写法,即可正常访问arguments.callee:
function foo(a, b) { console.log(arguments.callee); } foo(10, 50); // 正常打印foo函数本身
内容的提问来源于stack exchange,提问作者coderboy
相关产品推荐
相关产品推荐

