2011-12-20 34 views
6

Estoy tratando de minify un tercero biblioteca JavaScript usando Google Closure Compiler, pero él los errores hacia fuera en debajo de la línea:Javascript paquete, es una palabra clave reservada

inBlock.package = package = name 

El error es

ERROR - Error de análisis. nombre que falta después operador **

name anterior es una variable local dentro de una función y inBlock es un argumento de entrada. En ninguna parte de la función se declara package que no sea esa línea de error.

Supongo que puede deberse a package es una palabra clave reservada en JavaScript? ¿Alguna idea de qué paquete está en JavaScript y cómo solucionarlo?

Respuesta

7

Tienes razón, package es una palabra reservada en JavaScript (pero solo en modo estricto, que será la razón por la cual el código funciona en algunos lugares).

package está reservado en el futuro, lo que significa que no se usa para nada, pero no se puede usar para nombrar variables. Sin embargo (si realmente debe), puede utilizarlo para llaves de nombre en objetos como esto:

inBlock['package'] = name; // this is ok 

Como siempre y cuando utilice una cadena. No se puede hacer esto:

inBlock.package = name; // this is not ok 

diría que es mejor nombrarlo otra cosa.

+0

Sin embargo, realmente no necesita usar la sintaxis del soporte. [jsFiddle] (http://jsfiddle.net/4Lpyw/) @nnnnnn – Ryan

+0

Eso podría funcionar en algunos intérpretes, pero es ilegal (JavaScript: The Good Parts, página 103 - puede buscar el estándar si lo desea). –

+0

Oh, no lo sabía. Bueno, funciona en todos los navegadores que puedo probar al menos :) – Ryan

1

package es una palabra clave (de Java) reservada para un posible uso posterior en JavaScript. ¿La solución? El nombre de su variable de algo más :)

Si no puede cambiar el nombre de inBlock.package, acceder a ella usando la notación de soporte en su lugar:

inBlock['package'] 
1

Según MDN, package se encuentra en la categoría "reservado para el futuro". Dependiendo de la versión de qué navegador está utilizando y si su código está en modo estricto, puede o no ser capaz de utilizar esas palabras como identificadores. En otras palabras, debes evitar que estén seguros.

Usted puede utilizar con seguridad palabras reservadas como nombres de propiedades si se utiliza esta sintaxis:

inBlock["package"] = something; 

Pero eso no le ayuda con la variable de package. ¿Puedes cambiarle el nombre?

2

"paquete" es una palabra reservada en ecmascript 3. ecmascript 5 redujo el conjunto de palabras reservadas haciendo esto disponible al navegador que lo implementó, y lo introdujo nuevamente en el modo "estricto" de ecmascript 5 (que será la base de futuras revisiones emcascript).

Ecmascript 5 también cambió las restricciones impuestas a las palabras reservadas, específicamente, puede usar palabras reservadas como nombres de propiedad (independientemente del modo) pero no nombres de variables.

Como resultado, si pone Closure Compiler en modo EcmaScript 5, puede usar "inBlock.package" y no se quejará, pero si lo utiliza intente usarlo en versiones anteriores de IE (8,7,6 Creo) no podrá analizar. La mayoría de los otros navegadores no siguieron esa parte de la especificación y no se vieron afectados.

Cuestiones relacionadas