在新的ECMA5 Javascript标准中的argument.callee.name替代方案

时间:2013-03-21 20:31:56

标签: javascript ecmascript-5

我正在努力将一些旧代码移植到'严格模式',在ECMA5标准中,argument.callee和类似的argument.caller等的替代方法是什么?


ADDED INFO:我没有说明为什么我需要argument.caller / callee。

我正在移植的代码正在使用

assert.ok(elemNode, arguments.callee.name + ": Entity - " + entityId + " has been found");

如果它是简单的递归,我可以使用函数名称(){... function()...},但我似乎无法找到如何处理上述代码。

4 个答案:

答案 0 :(得分:7)

从ECMAScript 3开始,您可以使用命名函数表达式。在此之前,函数表达式是匿名的,这使arguments.callee成为必需。命名函数表达式使其不必要。所以这是推荐的替代方案。

请参阅the MDN docs for callee

实施例

[1,2,3,4,5].map(function factorial (n) {
    return !(n > 1) ? 1 : factorial(n-1)*n;
});

命名函数的好处(来自MDN文档):

  • 该函数可以像代码中的任何其他函数一样调用
  • 它不会污染命名空间
  • 此值不会改变
  • 它更高效(访问参数对象很昂贵)

答案 1 :(得分:3)

不是。

无法模仿或“ polyfill arguments.caller属性,已因安全原因而被移除,因此您无法爬上去范围链,代码中。

arguments.callee的最佳替代方法是只使用命名函数表达式,而不是匿名函数表达式,如

setTimeout(function loop() {
    if( /* condition */ ) {
        loop();  // instead of arguments.callee();
    }
}, 1000);

在几乎所有实现中,这也更快(访问arguments对象通常有点慢'

答案 2 :(得分:1)

您需要命名您的函数,然后只需通过该名称引用该函数。

答案 3 :(得分:0)

严格来说,没有相应的东西。作为John Resig points out,您需要在ECMAScript 5的严格模式下命名您的“匿名”函数,然后您可以直接调用它们。他的例子是:

setTimeout(function later(){
  // do stuff...
  setTimeout( later, 1000 );
}, 1000 );