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 getName var getName console.log(getName) getName=function(){ console.log(1); } getName='3' console.log(getName)
变量提升:
var a= 3 function fun() { if (a) { var a = 5; } console.log(a); } fun() //undefined
当函数内部声明了变量a时,函数内所有的a取值都不会取函数外的值。解析后:
var a= 3 function fun() { var a if (a) { a = 5; } console.log(a); } fun() //undefined
关于let:
ES6中新增了块级作用域let,可以把if和for循环变成块级作用域,let不属于window属性,同一块级内不能重复定义,let不会有变量提升,和var不同,在var之前打印变量显示undefined,let之前打印变量会报错,找不到。