繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM