函数中类似对象的构造函数,JavaScript

函数中类似对象的构造函数,JavaScript,javascript,Javascript,我一直在将一个JavaScript库翻译成C,我遇到了一些非常奇怪的事情 最初的作者在函数中有一个“构造函数”。它的定义是我以前从未见过的: 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

我一直在将一个JavaScript库翻译成C,我遇到了一些非常奇怪的事情

最初的作者在函数中有一个“构造函数”。它的定义是我以前从未见过的:

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....
    }
}
这是一种常见的做法吗?这是我第一次看到这样做

如果是这样,有人能解释一下为什么会有一组额外的括号吗?为什么不把他们都放在那里


这是否“有效”?

这是有效的是的,我想说的是,这样做只是为了将构造函数逻辑从其他代码中直观地分离出来,因为在类似范围内声明的任何变量在括号外仍然可见(只要您在同一个函数中)

它没有任何作用


我肮脏的秘密:我有时喜欢用javascript为我制作Visual Studio自动缩进代码。

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

从功能上讲,它没有增加任何东西。这只是一种视觉上的分离,应该在评论中完成

如果代码缩小,我可以看到这会导致问题,甚至:

var a = 1
{
    var b = 2
}
VS:


好吧,我来不及给出答案了,答案已经很好了,但不要真正解释{}语句实际上是什么

它被称为语句块,描述了所谓的复合语句,这意味着它允许您在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;从你简化的代码片段中得到的额外块似乎没有任何用途。我可以发布完整的代码,但它会很大…这是一个压缩库,你应该删除90%的变量。留下足够的空间来理解;-)使用与移动到WebStorm、Sublime和MonoDevelop,Linux FTWI真的很像VS,用了太长时间才真正想看看其他IDE,但是既然你听起来像是在你的新工具中找到了光明,你愿意和我分享是什么让它们如此伟大吗?(谁知道呢,有一天我可能不得不使用linux作为我的主要工作平台,而我拥有的更好的工具对它的干扰就越小(阅读:使用microsoft产品太久了,太愚蠢了,找不到新工具))这是真的,但是如果你不使用(可选)分号在每行末尾。@Snellface:运行时没有为您添加分号吗?没有,但这对我来说不是问题,因为我的脊椎为我添加了分号:P。不是每个人都使用添加分号的IDE。由于它们是可选的,人们可能不明白为什么应该使用它们。请注意:这当然是一种观点,可能有不使用它们的原因,比如每行代码保存一个字节(或两个字节,取决于您的编码)。。但是,同样地,您可以只使用分号而不是换行符,这可以为您节省更多的时间,因为有些系统每个换行符使用2个字符而不是一个(\r\n vs\n适用于感兴趣但不知道这一点的人,这取决于您的应用程序和/或操作系统)@Prabhu:我只是假设你在谈论开发运行时,如果你在谈论在你选择的浏览器中运行的javascript引擎,那么答案是否定的,javascript引擎不会向你的javascript添加分号,因为它可以以任何方式解析它。如果你说的是minifier运行时,那么它将取决于你的minifier,在完美世界中,他们会为你添加分号,但这确实取决于:P
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
}