Javascript中with语句的未来
我知道在Javascript中使用with语句在ECMAScript 5中是被禁止的,但它允许我们在Javascript中创建一些不错的DSL 例如,模板引擎和web DSL。他们使用with语句的一些作用域方法来获得DSLish的感觉 with语句和这类DSL是否有未来 没有with语句,这种DSL效果可以实现吗?Javascript中with语句的未来,javascript,dsl,coffeescript,ecmascript-5,Javascript,Dsl,Coffeescript,Ecmascript 5,我知道在Javascript中使用with语句在ECMAScript 5中是被禁止的,但它允许我们在Javascript中创建一些不错的DSL 例如,模板引擎和web DSL。他们使用with语句的一些作用域方法来获得DSLish的感觉 with语句和这类DSL是否有未来 没有with语句,这种DSL效果可以实现吗?在ECMAScript 5中被“禁止”是一种常见的误解 只有在ECMAScript 5的严格模式下(即opt-in),请注意使用语句的是一个语法错误。因此,您当然可以在完全兼容ECM
在ECMAScript 5中被“禁止”是一种常见的误解
只有在ECMAScript 5的严格模式下(即opt-in),请注意使用语句的是一个语法错误。因此,您当然可以在完全兼容ECMAScript 5的实现中使用和,只要它们出现在非严格(或Crockford称之为松散)代码中。这对性能来说不是很好(因为仅仅使用
就会扼杀现代引擎中的各种优化),但它会起作用
ECMAScript的未来版本很可能基于严格的模式行为,尽管也可能是opt-in。因此,当涉及到脚本的未来验证时,遵循严格模式当然是一个好主意。在coffeescript中,有一个很好的技巧可以让您继续使用花式DSL,而不必将与一起使用:
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”样式:
with(a_long_object_name_that_is_bloated) {
propertyA = 'moo';
propertyB = 'cow';
}
“var”样式:
var o = a_long_object_name_that_is_bloated;
o.propertyA = 'moo';
o.propertyB = 'cow';
为了回答Epeli的问题,我们来看看除了使用Adrien的技术外,咖啡的作用是什么。它使用这个。
而不是和语句。啊,太棒了!这几乎和魔术一样干净。有没有人用这个实现了一个模板引擎?我不这么认为,但是应该有可能使coffeekup()适应这个效果。这与“with”所做的不同。“with”将变量直接放入作用域中,而不是作为“this”的属性。下一个准文本看起来将成为JS DSL工具。