2011-03-21 40 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聲明。