2011-03-21 15 views
7

Sé que el uso de con -statement is not recommended en Javascript y está prohibido en ECMAScript 5, pero permite crear algunas bonitas DSL en Javascript.Futuro de la declaración with en Javascript

Por ejemplo CoffeeKup -templating engine y Zappa web DSL. Esos utilizan algunos veryweird métodos de alcance con el con -establecimiento para lograr el sentimiento DSLish para ellos.

¿Hay algún futuro con el con -statement y este tipo de DSL?

¿Se puede lograr este efecto DSL sin el con -estilo?

+0

ES Los próximos cuasi-literales parecen que se convertirán en la herramienta JS DSL. – c69

Respuesta

9

with siendo "prohibido" en ECMAScript 5 es un error común.

Solo en el modo estricto de ECMAScript 5 - que es opt-in, cuenta - with instrucción es un error de sintaxis. Por lo tanto, aún puede usar with en implementaciones totalmente compatibles con ECMAScript 5, siempre que ocurran en un código no estricto (o descuidado, como lo llama Crockford). No será bonito para el rendimiento (ya que la mera presencia de with a menudo mata varias optimizaciones en los motores modernos) pero funcionará.

Es muy probable que las versiones futuras de ECMAScript se basen en un comportamiento de modo estricto, aunque también es probable que se acepten también. Entonces, ajustarse al modo estricto es sin duda una buena idea cuando se trata de pruebas futuras de sus scripts.

10

En CoffeeScript, hay un buen truco para seguir usando DSL de lujo sin usar with:

using = (ob, fn) -> fn.apply(ob) 

html = 
    head : (obj) -> # implementation 
    body : (fn) -> # implementation 
    div : (str) -> # implementation 

using html, -> 
    @head 
    title: "My title" 
    @body => 
    @div "foo bar" 
    @div "qux moo" 

/* 
    in pure javascript you'd be using 
    with(html){ 
    head({title:"My title"}); 
    body(function(){ 
     div("foo bar"); 
     div("qux moo"); 
    }); 
    } 
*/ 
+1

¡Ah, increíble! Esto es casi tan limpio como el truco. ¿Alguien ha implementado un motor de plantillas usando esto? – Epeli

+1

No lo creo, sin embargo, debería ser posible adaptar coffeekup (https://github.com/mauricemach/coffeekup) para ese efecto. – Adrien

+1

Esto no es lo mismo que lo que "con" hace. "con" pone las variables directamente en el alcance, no como propiedades de "esto". – koops

2

¿Por qué no asignar un var para que apunte al objeto en lugar de utilizar con?

'con' estilo:

with(a_long_object_name_that_is_bloated) { 
    propertyA = 'moo'; 
    propertyB = 'cow'; 
} 

estilo 'var':

var o = a_long_object_name_that_is_bloated; 
o.propertyA = 'moo'; 
o.propertyB = 'cow'; 
1

Para responder a la pregunta de Epeli, echar un vistazo a CoffeeMugg el que hace lo que hace CoffeeKup pero usando la técnica de Adrien. Utiliza this. en lugar de la declaración with.

Cuestiones relacionadas