2011-04-09 15 views
7

En la consola de Google Chrome, cuando la entradaPor qué consola de Google Chrome tiros "SyntaxError: símbolo inesperado}" Al ingresar la (

(

y Enter, Chrome dice "SyntaxError: símbolo inesperado}"? ¿Por qué entrada es sólo "(", incluyendo no "}".

obtenemos el mismo error cuando la entrada

console.log(

no hay "}" !!!

El siguiente token debe ser lista de argumentos o ")", por lo que el mensaje de error debe ser "Lista de argumentos esperados" o "No cerrado (" o algo así.

Y quiero saber, ¿la entrada de la consola está analizada como StatementList(opt) (definida en ECMA-262)?

+0

Cuidado para publicar una parte del código que está lanzando dicho error? – Seth

+1

@Seth: Sí, no es fácil de ver. – BoltClock

+0

Relacionado: http://stackoverflow.com/questions/11989226/why-does-result-in-false-in-a-javascript-console –

Respuesta

21

Edit: Encontré el código exacto que se evalúa. El código está en "src/third_party/WebKit/Source/WebCore/inspector/InjectedScriptSource.js".

Antes de que la consola de Chrome evalúe su código, lo envuelve en un bloque with para llevar las funciones de la línea de comandos al ámbito. Entonces, lo que escribes se evalúa dentro de llaves. El token inesperado "}" es el que Chrome ingresa automáticamente.

El código que Chrome pasa a eval es

with ((window && window.console && window.console._commandLineAPI) || {}) { 
    <your code here> 
}; 

Debido a que es una simple sustitución de texto, el siguiente ejemplo funciona y el resultado es un objeto que se puede ampliar para ver la answer propiedad:

} 0, { answer: 42 

Qué (reordenada) es equivalente a:

with ((window && window.console && window.console._commandLineAPI) || {}) { 
} 
0, { answer: 42 }; 

El } al principio cierra el bloque with. La parte 0, es necesaria para forzar que el literal del objeto se analice como una expresión en lugar de otro bloque. Entonces, el { answer: 42 es el comienzo de un literal de objeto que se cierra con el token } insertado.

Para más diversión, aquí hay algunos otros insumos que trabajan (y sus resultados):

> }{ // an empty block, so no value 
    undefined 

> }!{ // !{} === false 
    false 

> }!!{ // !!{} === true 
    true 

> } +{ valueOf: function() { return 123; } 
    123 
+1

+1 por lo que equivale a una inyección SQL inteligente con Javascript ;-) Eso ' 0' * es * lo más curioso ... – Cameron

+0

Gracias por su rápida respuesta. Hmm ... Es muy complicado ... Así que Chrome parece analizar ''{' + text + '}''. Intenté '}; '10 '+ {' y obtener' "10 [object Object]" ', que es el mismo resultado que Firefox. – itchyny

+0

¡Guau! ¡Estupendo! ¡Vi la línea 280 de InjectedScriptSource.js para encontrar exactamente lo que estás diciendo! ¡Muchas gracias! – itchyny

Cuestiones relacionadas