This question already has an answer here:
- Alternative to arguments.callee 2 answers
I'm working on porting some old code to 'strict mode', what are the alternatives to the argument.callee and similar argument.caller etc in the ECMA5 standard?
ADDED INFO: I did not specify why I need the argument.caller/callee.
The code I'm porting is using
assert.ok(elemNode, arguments.callee.name + ": Entity - " + entityId + " has been found");
If it were simple recursion I could use function name(){ ... function() ... }, but I can't seem to find what to do with the above code.
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.
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 );
来源:https://stackoverflow.com/questions/15557487/argument-callee-name-alternative-in-the-new-ecma5-javascript-standard