2012-04-04 23 views
8

Estoy trabajando en modo estricto por primera vez y, lo que si, es también la primera vez en años que se puede utilizar una propiedad en modo no estricto sería útil . Mi question here delinea el problema exacto que estoy teniendo, pero la solución que he resuelto podría adaptarse a algo mucho más escalable si todavía tuviera acceso a arguments.callee.Replicar arguments.callee en el modo estricto

Sin nombrar la función ¿hay alguna manera en el modo estricto de que pueda obtener una referencia a la función cuyo alcance me encuentro actualmente?

+0

Puedes asignar tu función a alguna variable. – antyrat

+0

El progreso es algo hermoso. – Rolf

Respuesta

5

Sin nombrar la función es ¿Hay algún modo estricto en el que pueda obtener una referencia a la función cuyo alcance me encuentro actualmente?

No. Tiene que dar un nombre a la función. Mi error, pensé en una forma, vea el bloque de código final a continuación. No lo hago como, pero ahí estamos. :-)

Tenga en cuenta que la forma en que está dando la función de un nombre aquí:

UsageGraph = Graph.extend({ 
    generateScale: function GS() { 
     var parentMethod = this.constructor._super.generateScale; 
     if(parentMethod === GS) { 
      parentMethod = this.constructor._super.constructor._super.generateScale; 
     } 
     parentMethod.call(this); // run the parent's method 
     //do additional stuff 
    } 
}) 

... utiliza una expresión función llamada. Estos son notoriamente poco fiables (link, link) a través de implementaciones (que no deben ser, pero son), más notablemente en el ejemplo anterior, IE8 y anteriores creará dos objetos de función completamente separadas, asignando uno de ellos a la generateScale propiedad y refiriéndose a un objeto de función diferente dentro de la función como GS.

Es fácil de solucionar, sin embargo:

UsageGraph = Graph.extend(function(){ 
    function GS() { 
     var parentMethod = this.constructor._super.generateScale; 
     if(parentMethod === GS) { 
      parentMethod = this.constructor._super.constructor._super.generateScale; 
     } 
     parentMethod.call(this); // run the parent's method 
     //do additional stuff 
    } 

    return {generateScale: GS}; 
}()) 

O si usted realmente no desea que la función tiene un nombre (yo prefiero que tienen nombres, helps my tools help me, pero bueno), se puede utilizar una local dentro de ese cierre:

UsageGraph = Graph.extend(function(){ 
    var GS = function() { 
     var parentMethod = this.constructor._super.generateScale; 
     if(parentMethod === GS) { 
      parentMethod = this.constructor._super.constructor._super.generateScale; 
     } 
     parentMethod.call(this); // run the parent's method 
     //do additional stuff 
    }; 

    return {generateScale: GS}; 
}()) 

Ahora usted tienen una función anónima, pero puede referirse a ella como GS desde el interior de la misma. De nuevo, no lo recomendaría, porque entonces no se puede ver el nombre de la función en las pilas de llamadas, pero dijiste sin darle un nombre a la función, así que ...

+1

+1 para la información sobre el error wheresrhys

+0

@wheresrhys: (Es

0

Sí, pero no ... No estoy seguro de si este es el mismo tipo de "nombrar" del que hablas:

var foo = function bob() { 
    // call bob(); 
} 

// bob is undeclared; here it's foo! 

http://jsfiddle.net/4y8pY/

+3

Tenga cuidado al hacer esto con IE8 y versiones anteriores, crea [dos objetos de función completamente separados] (http://blog.niftysnippets.org/2010/09/double-take.html) y filtra el símbolo 'bob' cuando usa una expresión de función nombrada. –

+0

También tenga en cuenta que el que pregunta dice * "** Sin ** nombrar la función" * (mi énfasis). –

Cuestiones relacionadas