我一直在将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....
}
}
这是常见的做法吗?这是我第一次看到这样做。
如果是这样,有人可以解释为什么有一组额外的括号?为什么不在那里做所有这些?
这是否有效"?
答案 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
}
由于花括号也是对象文字,有时很难区分它们,但它们完全不同。