Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中with语句的未来_Javascript_Dsl_Coffeescript_Ecmascript 5 - Fatal编程技术网

Javascript中with语句的未来

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

我知道在Javascript中使用with语句在ECMAScript 5中是被禁止的,但它允许我们在Javascript中创建一些不错的DSL

例如,模板引擎和web DSL。他们使用with语句的一些作用域方法来获得DSLish的感觉

with语句和这类DSL是否有未来

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

在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工具。