2011-07-23 41 views
7

Me pregunto cómo se administran las palabras clave/funciones reservadas de JavaScript.javaScript palabras clave reservadas

Ejemplo:

Según:

http://www.quackit.com/javascript/javascript_reserved_words.cfm

delete es una palabra clave reservada por JavaScript.

Entonces considere el siguiente fragmento de un poco de contexto:

var cookieManager = { 
    get: function (name) { 
     // function contents ... 
     console.log("cookieManager.get() called"); 
     return true; 
    }, 
    set: function (name, value, days) { 
     // function contents ... 
     console.log("cookieManager.set() called"); 
     return true; 
    }, 
    delete: function (name) { 
     // function contents ... 
     console.log("cookieManager.delete() called"); 
     return true; 
    } 
}; 

Este objeto tiene una propiedad delete, sin embargo, el nombre de la misma está reservada JavaScript por lo que debe fallar, ¿verdad?

Sin embargo, cuando ejecuto cookieManager.delete(); en el webconsole de FireFox consigo la salida siguiente, lo que sugiere que funciona bien:

[11:26:00.654] cookieManager.delete(); 
[11:26:00.656] cookieManager.delete() called 
[11:26:00.657] true 

Sin embargo, si se ejecuta el código en JsLint dice

Problem at line 12 character 5: Expected an identifier and instead saw 'delete' (a reserved word). 

delete: function (name) { 

Sugiere que este es un gran no no enfoque y debe evitarse.

Entonces, cuando debería tener en cuenta palabras clave reservadas, como en este ejemplo parece funcionar como yo quiero (la palabra clave delete está en el contexto del objeto cookieManager y no causa conflictos, por lo tanto puede ser utilizado) o debería atenerme a la Biblia que es JsLint y renombrar cualquier cosa que sea una palabra reservada por javascript? En este contexto, podría cambiar fácilmente el nombre de .delete() por .remove().

Respuesta

8

En realidad esto está permitido según ECMAScript specification. Las reglas de producción (Section 11.1.5) para un objeto literal son:

ObjectLiteral : 
    {} 
    {PropertyNameAndValueList} 
    {PropertyNameAndValueList ,} 

PropertyNameAndValueList : 
    PropertyAssignment 
    PropertyNameAndValueList , PropertyAssignment 

PropertyAssignment : 
    PropertyName : AssignmentExpression 
    get PropertyName (){FunctionBody} 
    set PropertyName (PropertySetParameterList){FunctionBody} 

PropertyName : 
    IdentifierName 
    StringLiteral 
    NumericLiteral 

En su caso, se utiliza un IdentifierName como nombre de la propiedad. Section 7.6.1 dice:

una palabra reservada es una IdentifierName que no puede ser utilizado como un Identifier.

nota la diferencia: No se puede utilizar una palabra clave reservada como Identificador, pero ya que es un válido IdentifierName se puede usar como PropertyName.


Sin embargo, otras versiones (de) los navegadores podrían no toleran esto, así que para estar en el lado seguro, me gustaría cambiar su nombre.

Además de posibles problemas con los navegadores, también podría confundir a otros que leen el código y no están familiarizados con esta regla.


Fwiw, por supuesto, siempre puede utilizar palabras clave reservadas como cadenas:

var a = {'delete': 'foo'}; 
alert(a['delete']); 
+0

Por lo tanto, para aclarar, porque la regla de producción de '' PropertyName' utiliza IdentifierName' y no 'Identifier', es bien para utilizar 'eliminar' y así sucesivamente como un' PropertyName'? –

+0

@Delan: Yo diría que sí. Pero eso no significa que los navegadores sigan la misma regla. –

+0

También si ejecuta el código en '" modo estricto "' debería arrojar un error – Raynos

Cuestiones relacionadas