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
Cuidado para publicar una parte del código que está lanzando dicho error? – Seth
@Seth: Sí, no es fácil de ver. – BoltClock
Relacionado: http://stackoverflow.com/questions/11989226/why-does-result-in-false-in-a-javascript-console –