8

我知道在 Javascript中不推荐使用with语句,并且在 ECMAScript 5 中也被禁止,但它允许人们在 Javascript 中创建一些不错的 DSL。

例如CoffeeKup -模板引擎和Zappa web DSL。那些使用带有with语句的一些非常 奇怪的作用域方法来实现对他们的 DSLish 感觉。

with语句和这类 DSL有没有未来?

没有with语句可以实现这种 DSL 效果吗?

4

4 回答 4

10

在 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");
     });
   }
 */
于 2011-03-21T06:44:18.210 回答
9

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

只有在 ECMAScript 5 的严格模式下——请注意,它是opt-in ——with语句是语法错误。因此,您当然仍然可以with在完全符合 ECMAScript 5 的实现中使用它们,只要它们出现在非严格(或 Crockford 所说的草率)代码中。它的性能不会很好(因为仅仅存在with经常会扼杀现代引擎中的各种优化),但它会起作用。

ECMAScript 的未来版本很可能基于严格模式行为,尽管也可能是可选的。因此,在将来对脚本进行校对时,遵循严格模式当然是一个好主意。

于 2011-03-21T05:28:14.460 回答
2

为什么不直接分配一个 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';
于 2011-06-19T21:23:48.067 回答
1

要回答 Epeli 的问题,请看一下CoffeeMugg,它与 CoffeeKup 一样,但使用了 Adrien 的技术。它使用this.而不是with语句。

于 2012-01-30T02:50:59.393 回答