[英]Object like constructor in function, 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....
}
}
这是常见做法吗? 这是我第一次看到这样做。
如果是这样,有人可以解释为什么有一组额外的括号? 为什么不在那里做所有这些?
这甚至是“有效的”吗?
这是有效的,我会说这样做只是为了将构造函数逻辑与其他代码视觉分离,因为在这样的作用域内声明的任何变量仍然可以在括号外看到(只要你在同一个函数中) 。
它不起作用
我的肮脏秘密 :我有时喜欢使用javascript来为我制作Visual Studio自动缩进代码。
在代码中添加类似的额外括号绝对没有意义。
从功能上讲,它没有任何补充。 这只是一个应该在评论中完成的视觉分离。
如果代码被缩小,我可以看到这会导致问题,甚至:
var a = 1
{
var b = 2
}
VS:
var a = 1{var b = 2}
// SyntaxError: Unexpected token {
好的,我迟到了回答,答案已经很好了,但是并没有真正解释{}语句究竟是什么。
它被称为语句块,用于描述所谓的复合语句 ,这意味着它允许您在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
}
由于花括号也是对象文字,因此有时很难区分它们,但它们是完全不同的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.