今天在学习的过程中突如其想:
如果,我定义了一个变量赋了一个函数,又定义了一个同名函数,那么会执行哪一个呢?
于是:
var fun;
function fun(){} // fun(){}
可以看到定义为赋值的fun被赋值了定义的fun()函数,写到这里我想到,如果直接赋值的输出会不会是一样的效果。
var fun = function (){} // (){}
出乎意料的输出了一个匿名函数,因为赋值给fun变量的确实是一个匿名函数。
function fun(){}
var fun;
console.log(fun); // fun(){}
输出了fun函数,是因为var会提升,换成let就会报错啦。
var fun = 0;
function fun(){}
console.log(fun); // 0
fun(); //error fun is not a funciton
说明声明且赋值后的变量的权重高于函数声明,但是声明未赋值的话会被同名函数赋值。
var fun = function (){console.log(1);}
function fun () {console.log(2);}
fun(); // 1
后面的函数声明并没有替换掉前面的变量声明!基本的结论就但这里了,但是无意中又发现了什么:
console.log(fun); // fun(){}
fun(); // 1
function fun(){console.log(1);}
不仅仅var会提升 函数声明也会提升!且与var不同 函数声明中 函数体也会被提升!
结论:
函数声明会被提升,且变量声明赋值>函数声明>变量声明不赋值!
加一些彩蛋:
(() => {})();
// 等于
(function() {})();
// 等于
function a() {}
a();