我知道在 Javascript中不推荐使用with语句,并且在 ECMAScript 5 中也被禁止,但它允许人们在 Javascript 中创建一些不错的 DSL。
例如CoffeeKup -模板引擎和Zappa web DSL。那些使用带有with语句的一些非常 奇怪的作用域方法来实现对他们的 DSLish 感觉。
with语句和这类 DSL有没有未来?
没有with语句可以实现这种 DSL 效果吗?
我知道在 Javascript中不推荐使用with语句,并且在 ECMAScript 5 中也被禁止,但它允许人们在 Javascript 中创建一些不错的 DSL。
例如CoffeeKup -模板引擎和Zappa web DSL。那些使用带有with语句的一些非常 奇怪的作用域方法来实现对他们的 DSLish 感觉。
with语句和这类 DSL有没有未来?
没有with语句可以实现这种 DSL 效果吗?
在 coffeescript 中,有一个很好的技巧可以在不使用的情况下继续使用花哨的 dsls 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
在 ECMAScript 5 中被“禁止”是一种常见的误解。
只有在 ECMAScript 5 的严格模式下——请注意,它是opt-in ——with
语句是语法错误。因此,您当然仍然可以with
在完全符合 ECMAScript 5 的实现中使用它们,只要它们出现在非严格(或 Crockford 所说的草率)代码中。它的性能不会很好(因为仅仅存在with
经常会扼杀现代引擎中的各种优化),但它会起作用。
ECMAScript 的未来版本很可能基于严格模式行为,尽管也可能是可选的。因此,在将来对脚本进行校对时,遵循严格模式当然是一个好主意。
为什么不直接分配一个 var 来指向对象而不是使用 with?
'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 的问题,请看一下CoffeeMugg,它与 CoffeeKup 一样,但使用了 Adrien 的技术。它使用this.
而不是with
语句。