console.log(getName)var getName=function(){ console.log(1);}function getName(){ console.log(2);}var getName='3'console.log(getName)function getName(){ console.log(4);}
打印结果
function getName(){ console.log(4);}3
js引擎在解析代码时,会统一先声明,再赋值,是把所有声明提升到顶端,而赋值依然保留在原来的位置。函数会优先被提升,并且是整个函数被提升,变量提升取最后一次赋值为最终值,解析(声明提升)结果:
function getName(){ console.log(2);}function getName(){ console.log(4);}var getNamevar getNameconsole.log(getName)getName=function(){ console.log(1);}getName='3'console.log(getName)
变量提升:
var a= 3function fun() { if (a) { var a = 5; } console.log(a); }fun() //undefined
当函数内部声明了变量a时,函数内所有的a取值都不会取函数外的值。解析后:
var a= 3function fun() { var a if (a) { a = 5; } console.log(a); }fun() //undefined
关于let:
ES6中新增了块级作用域let,可以把if和for循环变成块级作用域,let不属于window属性,同一块级内不能重复定义,let不会有变量提升,和var不同,在var之前打印变量显示undefined,let之前打印变量会报错,找不到。