passed - javascript params array
Arguments.callee está en desuso, ¿qué debería usarse en su lugar? (3)
Por hacer cosas como
setTimeout(function () {
...
setTimeout(arguments.callee, 100);
}, 100);
Necesito algo como arguments.callee
. Encontré información en javascript.info que arguments.callee
está en desuso:
Esta propiedad está obsoleta por ECMA-262 a favor de expresiones de función nombradas y para un mejor rendimiento.
Pero, ¿qué debería usarse en su lugar? ¿Algo como esto?
setTimeout(function myhandler() {
...
setTimeout(myhandler, 100);
}, 100);
// has a big advantage that myhandler cannot be seen here!!!
// so it doesn''t spoil namespace
Por cierto, ¿es compatible con los navegadores compatibles con arguments.callee
?
Pero, ¿qué debería usarse en su lugar? ¿Algo como esto?
Sí, respondiste tu propia pregunta. Para más información, mira aquí:
¿Por qué la propiedad arguments.callee.caller se desaprovechó en JavaScript?
Tiene una discusión bastante buena sobre por qué se realizó este cambio.
Sí, eso es lo que, teóricamente, debería usarse. Tienes razón. Sin embargo, no funciona en algunas versiones de Internet Explorer, como siempre. Así que ten cuidado. Es posible que necesite recurrir a arguments.callee
o, mejor dicho, a un simple:
function callback() {
// ...
setTimeout(callback, 100);
}
setTimeout(callback, 100);
Que funciona en IE.
la respuesta de minitech es bastante buena, pero falta un escenario más. Su función de declaración llamada devolución de llamada, que significa dos cosas, primero la función es objeto en la memoria, y el segundo, el nombre de la función es solo para hacer referencia al objeto. Si usted, por alguna razón, rompe la referencia entre estos dos, el código propuesto tampoco funcionará.
Prueba:
function callback() {
// ...
setTimeout(callback, 100);
}
setTimeout(callback, 100);
var callback2 = callback; //another reference to the same object
callback = null; //break the first reference
callback2(); //callback in setTimeout now is null.
De la página del desarrollador Mozilla en la descripción es:
Advertencia: La quinta edición de ECMAScript (ES5) prohíbe el uso de arguments.callee () en modo estricto. Evite usar arguments.callee () dando un nombre a las expresiones de función o use una declaración de función donde una función debe llamarse a sí misma.
Obviamente, este es el primer ejemplo de solución " al darle un nombre a las expresiones de función ", pero veamos cómo podemos tratar " o usar una declaración de función donde una función debe llamarse a sí misma " y lo que traerá:
function callback(){
//...
setTimeout(innercall(), 100);
function innercall(){
//innercall is safe to use in callback context
innercall.caller(); //this will call callback();
}
}
Entonces estamos seguros de hacer lo que queramos con la referencia de devolución de llamada:
var callback2 = callback;
callback = null;
callback2(); //will work perfectly.