2011-03-21 75 views
7

我知道在Javascript中使用 -statement is not recommended并且在ECMAScript 5中被禁止,但它允许使用Javascript创建一些不错的DSL。在Javascript中使用语句的未来

例如CoffeeKup模拟引擎和Zappa网络DSL。那些使用一些veryweird作用范围方法与 -statement来实现对他们的DSLish感觉。

是否有任何未来与 -statement和这些类型的DSL?

如果没有 -statement,可以实现此DSL效果吗?

+0

ES下一个准文字看起来像他们将成为JS DSL工具。 – c69 2011-10-04 17:27:09

回答

9

with在ECMAScript 5中被“禁止”是常见的误解

仅限于ECMAScript 5的严格模式 - 即选择加入,请注意 - with语句是语法错误。因此,您完全可以在完全符合ECMAScript 5的实现中使用with,只要它们出现在非严格(或马虎,因为Crockford称之为)代码中。它的性能不会很好(因为with的存在经常会导致现代发动机的各种优化),但它会起作用。

ECMAScript的未来版本很可能基于严格的模式行为,尽管也可能会选择加入。因此,在未来验证脚本时,遵循严格模式当然是一个好主意。

10

在CoffeeScript中,有一个很好的把戏继续使用花哨的DSL,而无需使用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

啊,太棒了!这几乎和有技巧一样干净。任何人还没有使用这个模板引擎? – Epeli 2011-03-21 07:03:09

+1

不要这么想,但是应该可以调整coffeekup(https://github.com/mauricemach/coffeekup)。 – Adrien 2011-03-21 07:05:45

+1

这与“with”不一样。 “with”直接将变量放在范围内,而不是“this”的属性。 – koops 2013-04-01 22:58:45

2

为什么不只是分配一个变种指向的对象,而不是使用?

'与' 风格:

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

'变种' 风格:

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

要回答埃佩利的问题,看看CoffeeMugg这做什么CoffeeKup做,但使用阿德里安的技术。它使用this.而不是with声明。