¿Por qué este código arroja un error?(function eval() {}) arroja un error de sintaxis si el cuerpo de la función está en modo estricto?
// global non-strict code
(function eval() { 'use strict'; });
Demostración en directo:http://jsfiddle.net/SE3eX/1/
Por lo tanto, lo que tenemos aquí es una expresión de la función llamada. Me gustaría señalar explícitamente que esta expresión de función aparece en código no estricto. Como puede ver, su cuerpo de función es un código estricto.
Las reglas de modo estricto está aquí: http://ecma-international.org/ecma-262/5.1/#sec-C
La bala relevante es este (que es el último de la lista):
It is a SyntaxError to use within strict mode code the identifiers eval or arguments as the Identifier of a FunctionDeclaration or FunctionExpression or as a formal parameter name (13.1). Attempting to dynamically define such a strict mode function using the Function constructor (15.3.2) will throw a SyntaxError exception.
Observe cómo sólo se aplica esta regla si la declaración de la función/La expresión en sí misma aparece en el código estricto, que hace no en mi ejemplo anterior.
¿Todavía se echa un error? ¿Por qué?
Solo estoy adivinando aquí, pero quizás tenga algo que ver con el hecho de que en una * expresión *, una expresión de instanciación de función con un nombre enlaza ese nombre solo * dentro * de la función; en otras palabras, es internamente como si hubiera alguna forma mágica para que una declaración 'var' creara una variable local inicializada con una referencia a la función. Por lo tanto, es como si estuvieras intentando vincular localmente el símbolo global "eval". – Pointy
@Pointy Buena pista. Tendré que verificar el estándar para establecer qué está sucediendo exactamente en ese escenario ... –
Obtiene el mismo mensaje de error (SyntaxError: nombre de la función puede no ser eval o argumentos en modo estricto) con solo 'function eval() {'use strict'; }; ' – some