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
匿名函数