¿Por qué utilizar \ x3C en lugar de <al generar HTML desde JavaScript?

Veo que el siguiente código HTML se usa mucho para cargar jQuery desde una networking de entrega de contenido, pero vuelve a una copy local si el CDN no está disponible (por ejemplo, en los documentos de Modernizr ):

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.js"></script> <script>window.jQuery || document.write('<script src="js/libs/jquery-1.6.1.min.js">\x3C/script>')</script> 

Mi pregunta es, ¿por qué el último < carácter en la statement document.write() reemplazado con la secuencia de escape \x3C ? < es un carácter seguro en JavaScript e incluso se usa antes en la misma cadena, entonces ¿por qué escaping de allí? ¿Es solo para evitar que las malas implementaciones de los browseres piensen que el </script> dentro de la cadena es la label final real del script? Si es así, ¿hay realmente algún browser que falle en esto?

Como una pregunta de seguimiento, también he visto una variante usando unescape() (como se da en esta respuesta ) en la naturaleza un par de veces también. ¿Hay alguna razón por la cual esa versión siempre parece sustituir todos los caracteres < y > ?

Cuando el browser ve </script> , considera que esto es el final del bloque de scripts (dado que el analizador de HTML no tiene idea sobre JavaScript, no puede distinguir entre algo que simplemente aparece en una cadena, y algo que realmente significa para finalizar el elemento script). Así que </script> aparece literalmente en JavaScript dentro de una página HTML (en el mejor de los casos) causa errores y (en el peor de los casos) es un gran agujero de security.

Es por eso que de alguna manera tiene que evitar que aparezca esta secuencia de caracteres. Otras soluciones comunes para este problema son "<"+"/script>" y "<\/script>" (todas se networkingucen a lo mismo).

Si bien algunos consideran que se trata de un "error", en realidad tiene que ocurrir de esta manera, ya que, según la especificación , la parte HTML del agente de usuario está completamente separada del motor de scripting. Puede poner todo tipo de cosas en tags <script> , no solo JavaScript. El W3C menciona VBScript y TCL como ejemplos. Otro ejemplo es el plugin de plantilla jQuery , que también usa esas tags.

Pero incluso dentro de JavaScript, donde podría sugerir que dicho contenido en cadenas podría reconocerse y, por lo tanto, no tratarse como tags de finalización, la siguiente ambigüedad popupá cuando tenga en count los comentarios:

 <script type="text/javascript">foo(42); // call the function </script> 

– ¿Qué debería hacer el browser en este caso?

Y finalmente, ¿qué hay de los browseres que ni siquiera conocen JavaScript? Simplemente ignorarían la parte entre <script> y </script> , pero si le diera una semántica diferente a la secuencia de caracteres </script> basada en el conocimiento de JavaScript de los browseres , de repente tendría dos resultados diferentes en el análisis de HTML etapa .

Por último, con respecto a su pregunta sobre la sustitución de todos los paréntesis angulares: diría que al less en el 99% de los casos, es para ofuscación, es decir, para ocultar (del software antivirus, proxies de censura (como en su ejemplo) )), etc.) el hecho de que su JavaScript está haciendo algo de HTML-y. No puedo pensar en buenas razones técnicas para ocultar todo less </script> , al less no para browseres razonablemente modernos (y con eso, me refiero a prácticamente cualquier cosa más nueva que Mosaic).

Algunos analizadores manejan la < versión como la label de cierre e interpretan el código como

 <script> window.jQuery || document.write('<script src="js/libs/jquery-1.6.1.min.js"> </script> 

\x3C es hexadecimal para < . Esos son intercambiables dentro del script.