ES5的“严格模式”和arguments.callee

7
在ES5严格模式下(即`"use strict"`),不再提供指向当前函数的变量`arguments.callee`。对于递归函数,显然使用函数自己的名称是合理的。但是,有时我可能想要使用`arguments.callee`的属性(例如`.length`、`.prototype`)而不必使用当前函数的名称。是否有人能解释一下,为什么会移除它,解决了什么问题?可能是重复问题:为什么JavaScript中的arguments.callee.caller属性已被弃用?

很糟糕的做法。所有使用 arguments.callee 的情况都可以用更优雅的方式解决,或者根本不应该解决。 - Ry-
1
相关:https://dev59.com/lnVD5IYBdhLWcg3wDXJ3。 - Frédéric Hamidi
至于边缘情况:这就是为什么我不再使用严格模式的一部分... :P - Ry-
1
@ 关闭投票者 - 那个问题是关于 arguments.callee 的特定子属性的。 - Alnitak
1
@Alnitak:答案“意外”很大程度上是关于.callee的。 - pimvdb
1个回答

5

来自这里

arguments.callee 会大大阻碍像内联函数这样的优化,因为如果访问 arguments.callee,就必须能够提供对未内联函数的引用。


你知道为什么在命名函数的情况下不需要引用吗? - pimvdb
@pimvdb 因为函数的名称总是在函数本身的局部作用域中可用。 - xdazz
我和 @pimvdb 一样好奇,但我不明白你是如何回答他的问题的。如果你可以通过 return <name> 提供函数未内联版本的引用,那么这与通过 return arguments.callee 提供引用没有任何区别。对吗?如果是这样,为什么? - ELLIOTTCABLE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接