argument.callee.name alternative in the new ECMA5 Javascript Standard [duplicate]

非 Y 不嫁゛ 提交于 2019-11-29 10:47:14

Starting with ECMAScript 3, you can have named function expressions. Prior to that function expressions were anonymous, which made arguments.callee necessary. Named function expressions made it unnecessary. So that's the recommended alternative.

See the MDN docs for callee

Example:

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

The benefits of named functions (from the MDN docs):

  • the function can be called like any other from inside your code
  • it does not pollute the namespace
  • the value of this does not change
  • it's more performant (accessing the arguments object is expensive)

Not really.

There is no way to mimic or "polyfill" the arguments.caller property, that has been removed for security reasons, so you can't climb up the scope chain, in-code.

The best alternative for arguments.callee is to just to have named function expressions, instead of anonymous function expressions, like

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

That is also faster in almost all implementations (accessing the arguments objects is somewhat slow'ish in general)

You need to name your function and then just reference the function by that name.

There is no equivalent, strictly speaking. As John Resig points out, you need to name your "anonymous" functions in ECMAScript 5's strict mode and then you can call them directly. His example is:

setTimeout(function later(){
  // do stuff...
  setTimeout( later, 1000 );
}, 1000 );
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!