js问题,函数格式问题2?

var a=1;

                  (function(){    

                        console.log(a); 

                        var a=2;    

                        console.log(a);

                  })();

问题1:函数不是只有

1:function fn1(){

}

2:fn1=  function(){

}

这两种写法吗?

为什么会有将整个函数括号起来在后面再来个小括号的写法?

问题2:

var a = 1在第一行,所以已经声明并初始化,而且它在第一行也是首先首先执行,并且var a自动被提升在最上,

下面的funciton也是声明提升,那var a与function都提升的话,①哪个在前哪个在后?②变量的初始化不提升但是变量的初识化在第一位,所以如果排个顺序的话(1、var a先提升,2、function后提升就提升在var a前面了 3、所以第一名就是function ,第二名就是var a,因为var a只是声明提升但是初始化没提升所以var a = 1就被排在第三名了)?是不是这样理解?

这样的函数执行方式属于自执行函数,去掉外面的括号里面是一个匿名函数,举个例子我定义一个函数。

function fun(){};

那么如果我想要调用这个函数需要fun(),这样函数就可以被调用了,可是匿名函数没有函数名怎么调用,模仿上面例子的调用方式在匿名函数后面加一个括号function(){}()调用这个函数,会报错,因为无法解析,解析器不知道你最后的()是一个函数申明还是一个函数调用。所以,任何消除函数声明和函数表达式间歧义的方法,都可以被解析器正确识别,赋值,逻辑,甚至是逗号,各种操作符都可以告诉解析器,这个不是函数声明,它是个函数表达式,加括号是因为这样相对来书解析的更快,通常情况下这样函数的使用场景用于闭包。

你的第二个问题没有看明白,不过函数的提升大于变量的提升。

1.整个函数用()括起来是自执行函数(不用调用自己执行)。

2.

根据官方书籍《你不知道的javascript》(上卷)中写道:

“函数会首先被提升,然后才是变量”。

https://www.cnblogs.com/nayek/p/12612531.html

匿名函数