2014-09-29 154 views
2

我一直在翻译一个JavaScript库到C#和我碰到一些奇怪的东西给我对象像函数的构造,JavaScript的

原作者有一个函数内部的“构造”。这是我以前从未见过的一种方式:

var name = function(/*parameters*/) 
{ 
    /*Set instance variables here*/ 
    this.BMAX = 16; // maximum bit length of any code 
    this.N_MAX = 288; // maximum number of codes in any set 
    { 
     /*Constructor logic here*/ 

     var a;   // counter for codes of length k 
     var c = new Array(this.BMAX+1); // bit length count table 
     var el;   // length of EOB code (value 256) 
     var f;   // i repeats in table every f entries 

     //Etc.... 
    } 
} 

这是常见的做法吗?这是我第一次看到这样做。

如果是这样,有人可以解释为什么有一组额外的括号?为什么不把它们全部放在那里?

这是否“有效”?

+0

额外块,从减少的代码片段,似乎任何起不到任何作用。 – Quentin 2014-09-29 10:11:44

+0

我可以发布完整的代码,但它会大......它的压缩库 – FabianCook 2014-09-29 10:12:06

+2

你应该删除90%的变量。留下足够的关键点;-) – Cerbrus 2014-09-29 10:16:26

回答

2

好吧,我迟到了下降的答案,答案已经是很大的,但并不真正解释{}声明的实际内容。

这就是所谓的语句块描述所谓的复合语句,这意味着它可以让你添加多个substatements地方的JavaScript只需要一个子语句。

你可能已经看到了这一点已经

if(foo) 
    doStomething(); 
else 
    doSomethingElse(); 

,并问过自己?搞什么鬼?那些大括号在哪里?这不是特例。这就是javascript中大多数语句的样子,他们通常期望在默认情况下使用单个语句。通过使用语句块,我们可以将其扩展为复合语句,其中包含尽可能多的子语言。

是否存在与语句块相反的内容?是的,这就是所谓的空的陈述;。这意味着没有声明预计单一的陈述。

for(var i=0; i<100; i++); //empty statement 
console.log(i); //Is called once, logs "100" 
doSomething(i); //Is called once, with 100 as argument; 

这是完全有效的,即使在这种情况下无用。但是,这也是一种可以用于循环的方式,它有时更短,更优雅。

for(var i=0; i<100; i++) //no empty statement 
console.log(i); //Is called 100 times, logs 0 - 99 
doSomething(i); //Is called once with 100 as argument; 

最后喜欢它通常写的,与复合语句

for(var i=0; i<100; i++){ //compound statement 
    console.log(i); //logs 100 times 
    doSomething(i); //gets called 100 times 
} 

由于大括号也是对象字面它当然很难分辨它们有时,但它们是完全不同的事情。

Reference

+0

这是我正在寻找的答案,谢谢。对不起,其他的老兄。 – FabianCook 2014-09-29 18:53:20

3

这是有效的是的,我会说这样做只是为了将构造函数逻辑从其他代码中分离出来,因为在这样的范围内声明的任何变量在括号外仍然可见(只要您处于相同的功能)。

它用于任何功能性用途

我肮脏的秘密:我有时会做这样的使用JavaScript,使Visual Studio的自动缩进代码我。

+0

用于使用VS.移动到WebStorm,Sublime和MonoDevelop,Linux FTW – FabianCook 2014-09-29 10:19:18

+0

我真的很喜欢VS,用它太久了,真的不想看看其他的IDE,但是因为你听起来像你发现新工具中的灯光,你想分享我是什么让他们如此伟大? (谁知道,有一天我可能不得不使用linux作为我的主要工作平台,而我用的更好的工具则不那么麻烦,因为我会用它(阅读:一直使用微软产品太长,太愚蠢以至于找不到新工具)) – Snellface 2014-09-29 10:35:48

3

在代码中添加额外括号是绝对没有意义的。

在功能上,它什么也没加。这只是一个应该在评论中完成的视觉分离。

我可以看到这导致问题,如果代码已经过压缩,即使是:

var a = 1 
{ 
    var b = 2 
} 

VS:

var a = 1{var b = 2} 
// SyntaxError: Unexpected token { 
+1

这是真的,但是如果你不在每行的末尾使用(可选的)分号,它只会是一个问题。 – Snellface 2014-09-29 10:20:24

+0

@Snellface:运行时没有为你添加分号吗? – 2014-09-29 10:21:08

+0

不,不,它对我来说不是问题,因为我的脊柱为我添加了它们:P。不是每个人都使用添加分号的IDE。而且由于它们是可选的,所以人们可能不知道为什么要使用它们。 – Snellface 2014-09-29 10:27:31