在Javascript中使用语句的未来
问题描述:
我知道在Javascript中使用和 -statement is not recommended并且在ECMAScript 5中被禁止,但它允许使用Javascript创建一些不错的DSL。在Javascript中使用语句的未来
例如CoffeeKup模拟引擎和Zappa网络DSL。那些使用一些veryweird作用范围方法与和 -statement来实现对他们的DSLish感觉。
是否有任何未来与与 -statement和这些类型的DSL?
如果没有和 -statement,可以实现此DSL效果吗?
答
with
在ECMAScript 5中被“禁止”是常见的误解。
仅限于ECMAScript 5的严格模式 - 即选择加入,请注意 - with
语句是语法错误。因此,您完全可以在完全符合ECMAScript 5的实现中使用with
,只要它们出现在非严格(或马虎,因为Crockford称之为)代码中。它的性能不会很好(因为with
的存在经常会导致现代发动机的各种优化),但它会起作用。
ECMAScript的未来版本很可能基于严格的模式行为,尽管也可能会选择加入。因此,在未来验证脚本时,遵循严格模式当然是一个好主意。
答
在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");
});
}
*/
答
为什么不只是分配一个变种指向的对象,而不是使用?
'与' 风格:
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';
ES下一个准文字看起来像他们将成为JS DSL工具。 – c69 2011-10-04 17:27:09