2011-12-02 24 views
33

Para hacer las cosas comoArguments.callee está en desuso - ¿qué debería usarse en su lugar?

setTimeout(function() { 
    ... 
    setTimeout(arguments.callee, 100); 
}, 100); 

necesito algo así como arguments.callee. He encontrado que information at javascript.infoarguments.callee es obsoleto:

Esta propiedad es obsoleto por ECMA-262 a favor de la función llamada expresiones 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 

BTW, ¿es arguments.callee compatible con varios navegadores?

+2

para WH vale la pena: [expresiones de funciones nombradas desmitificadas] (http://kangax.github.com/nfe/). – sdleihssirhc

+0

Sí, debe nombrar su función y usar su nombre en setTimeout. – kubetz

+1

posible duplicado de [¿Por qué la propiedad arguments.callee.caller está en desuso en JavaScript?] (Http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in- javascript) – cHao

Respuesta

10

Sí, eso es lo que, teóricamente, se debe usar. Tienes razón. Sin embargo, no funciona en algunas versiones de Internet Explorer, como siempre. Así que ten cuidado. Es posible que tenga que recurrir a arguments.callee, o, más bien, un simple:

function callback() { 
    // ... 
    setTimeout(callback, 100); 
} 

setTimeout(callback, 100); 

Qué funciona en IE.

+1

Espera: ¿quieres decir que 'setTimeout (función myhandler() {setTimeout (myhandler ...' no funcionará en algunas versiones de IE? ¿Es esto algo no estándar? Pensé que era una cosa bastante estándar que hacer . – TMS

+3

@TomasT .: It * is * standard, pero ¿desde cuándo IE ha sido completamente estándar? :) (Bueno, tal vez IE10.) Recuerdo que me tropecé con él en algún momento. Una prueba rápida revela que no es un problema en IE7 al menos. Probablemente IE6. No tengo que probarlo. – Ryan

+0

Según Microsoft, funciona en IE6: https://docs.microsoft.com/en-us/scripting/javascript/reference/callee -property-arguments-javascript –

0

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 developer Mozilla page en la descripción es:

Advertencia: La quinta edición de ECMAScript (ES5) prohíbe el uso de arguments.callee() en modo estricto. Evite el uso de arguments.callee() por 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 la solución provisional "ya sea por función dar expresiones un nombre", pero vamos a ver cómo podemos hacer frente a "o utilizar una declaración de función en una función debe llamarse" y lo que habrá que llevar:

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. 
+0

'llamante' no es una buena práctica , y el código de ejemplo aquí en realidad no parece establecer un tiempo de espera. Simplemente no sobrescriba su función declarada. – Ryan

Cuestiones relacionadas