2010-08-10 22 views
7

Al depurar un código javascript que utiliza jQuery me encontré con el siguiente código:¿Qué hace este (¿inútil?) Código de javascript?

[0, 0].sort(function() 
{ 
    baseHasDuplicate = false; 
    return 0; 
}); 

Por mi comprensión de Javascript a este código va a clasificar matriz que contiene dos ceros con función de comparación que siempre va a establecer una variable global y volverán igualdad , que tiene el mismo efecto que baseHasDuplicate = false;.
Viniendo de una fuente valiosa, creo que me perdí algo. ¿Me perdí algo o es una programación fallida?

Respuesta

12

Como puede ver here (chino), este código puede usarse para probar Chrome. EDIT: ver más abajo para la historia completa ..

Como se explica en el artículo, lo que sucede es que Chrome optimiza el método ".Sort (...)" de tal manera que la llamada [0, 0].sort(...) no lo hará ejecutar la función de comparación dada.

Desde el artículo, la aplicación del ".Sort (...)" de Chrome es algo así como:

function sort(comparefn) { 
    var custom_compare = (typeof(comparefn) === 'function'); 
    function Compare(x,y) { 
    if (x === y) return 0; 
    if (custom_compare) { 
     return comparefn.call(null, x, y); 
    } 
    ... 
} 

Como 0 === 0 es cierto, no va a llamar comparefn.

En el caso de jQuery, no establecerá la variable global baseHasDuplicate en false.


EDITAR: si examina el código fuente de chisporroteo, here por ejemplo (ir a la sección amarilla bajo "chisporroteo CSS Selector de motor", llamado "variables del chisporroteo"), se encuentra la siguiente explicación:

var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, 
     done = 0, 
     toString = Object.prototype.toString, 
     hasDuplicate = false, 
     baseHasDuplicate = true; 

// Here we check if the JavaScript engine is using some sort of 
// optimization where it does not always call our comparision 
// function. If that is the case, discard the hasDuplicate value. 
// Thus far that includes Google Chrome. 
[0, 0].sort(function(){ 
     baseHasDuplicate = false; 
     return 0; 
});  

Looks demystified!

+2

eso es un poco duro teniendo en cuenta que hay métodos fáciles de verificar que – Dani

+1

oh, la programación falla en todas partes. a veces la gente realmente le gusta la mala forma de hacer las cosas :) –

+0

@Dani: ¡de hecho! Sin embargo, el código podría ser utilizado para otra cosa ... Sería genial escuchar de "el Javascript Ninja". –