2009-12-20 14 views

Respuesta

6
String(f1) === String(f2) 
+2

Creo que te refieres a 'String (f1) === String (f2)' a menos que tengas un método 'string()' personalizado que no conozco :) –

+3

Otra forma de escribirlo, para los ahorradores de bytes allí: '" "+ f1 ===" "+ f2' –

+0

¿Funciona con' (String (f1.bind (this)) === String (f1.bind (this))) '? ¿Yo creo que no? –

6
var f1 = f2 = function(a){ return a; }; 

aquí, puede utilizar f1 === f2 porque están apuntando a la misma memoria y son del mismo tipo

var f1 = function(a){ return a; }, 
    f2 = function(a){ return a; }; 

aquí se puede utilizar ese byte-protector de Andy E utilizada (que está convirtiendo implícitamente la función a su texto del cuerpo como una cadena),

''+f1 == ''+f2.

Ésta es la esencia de lo que está sucediendo detrás de las scences:

f1.toString() == f2.toString() 

Editar: Mirando hacia atrás en este post más de un año después, estoy de acuerdo con @kangax - es probable que nunca se debe hacer esta.

+0

+1 para una respuesta más elaborada –

+0

jaja, pero es su respuesta ... Simplemente no sé la cantidad de magia negra de JavaScript que el autor ha hecho (como la que tenemos) antes,: P –

+7

Tenga en cuenta que 'var f1 = f2 = function() {...} 'da como resultado que' f2' se convierta en una propiedad global, debido a la asignación de funciones no declaradas a 'f2'. Las asignaciones no declaradas son generalmente perjudiciales, por lo que es mejor evitar ese patrón. Además, no confíe en 'Function.prototype.toString' - no está estandarizado y varía en todos los navegadores. – kangax

0

Cuando necesito comparar funciones, me aseguro de que no haya ambigüedad en el alcance y use el mismo objeto de función.

Supongamos que tengo algunas funciones de biblioteca que toman una devolución de llamada como uno de los parámetros. Por el bien de este ejemplo, la función create1minuteCallback establecerá un temporizador de 1 minuto y llamará a la devolución de llamada en cada tilde. kill1minuteCallback desactivará la devolución de llamada y debe pasar la misma función de devolución de llamada que hizo para create1minuteCallback.

function create1minuteCallback(callback){ 
//implementation 
} 

function kill1minuteCallback(callback){ 
//implementation 
} 

Es evidente que esto no funcionará como la función que estamos pasando es diferente en la segunda línea:

create1minuteCallback(function(){alert("1 minute callback is called");}); 
kill1minuteCallback(function(){alert("1 minute callback is called");}); 

normalmente hago esto:

function callbackFunc(){alert("1 minute callback is called");} 

create1minuteCallback(callbackFunc); 
kill1minuteCallback(callbackFunc); 
0

Bueno, la forma más sencilla eso - si vas a comparar funciones, lo haces por una razón que asumo. ¿Cuál es tu razón? Mi razón fue no ejecutar una determinada función dos veces. lo hice de esta manera (solo fragmento de código para obtener la idea)

var x = function(){ 
    console.error("i am a functionX"); 
    } 
    var y = function(){ 
     console.error("i am a functionX"); 



    } 

    var z = function(){ 
     console.error("i am a functionZ"); 



    } 
     var x2= x; 

    var obj = new Object(); 
    obj[x] = ""; 
    obj[x2] = ""; 
    obj[y] = ""; 
    obj[z] = ""; 
    obj.abc = "xaxa"; 
       for (prop in obj) { 
        if (obj.hasOwnProperty(prop)) { 
         console.error(obj[prop] + " hello " + prop); 
        } 
      } 

Función X e Y son los mismos, a pesar de que tienen diferentes espacios en blanco. xey no son lo mismo que z, ya que z tiene un console.error diferente. Btw open your firebug console to see it in the jsbin example

Cuestiones relacionadas