对象就像函数中的构造函数,JavaScript

时间:2014-09-29 10:06:12

标签: 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 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....
    }
}

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

如果是这样,有人可以解释为什么有一组额外的括号?为什么不在那里做所有这些?

这是否有效"?

3 个答案:

答案 0 :(得分:3)

这是有效的,我会说这样做只是为了将构造函数逻辑与其他代码视觉分开,因为在这样的范围内声明的任何变量仍然可以在括号外看到(只要你在相同的功能)。

它不起作用

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

答案 1 :(得分:3)

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

从功能上讲,它什么都没有增加。它只是一种视觉分离,应该在评论中完成。

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

var a = 1
{
    var b = 2
}

VS:

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

答案 2 :(得分:2)

好的我迟到了回答并且答案已经很好了,但是并没有真正解释{}声明究竟是什么。

它被称为语句块,用于描述所谓的复合语句,这意味着它允许您在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