1.变量提升和函数提升一般会出现在先使用再声明的情况下,例如:
console.log(x);
var x=1;
这个时候由于变量为先声明就使用则会导致变量提升,所以上述代码应该如下解析:
var x;
console.log(x);
x=1;
2.匿名函数出现变量提升
匿名函数不会出现函数提升,只会出现变量提升,如下:
var getName=function(){ console.log(2); } function getName(){ console.log(1); } getName();
很多人可能会以为结果是1,结果是2,解析如下:
function getName(){ //函数声明提升到顶部 console.log(1); } var getName; //变量声明提升 getName = function(){ //变量赋值依然保留在原来的位置 console.log(2); } getName();
3.函数声明和函数表达式的区别
function jsFun6(){ //函数声明和函数表达式的区别 test1();//函数声明提升,在执行代码之前会先读取函数声明,不会报错 function test1(){//函数声明方式创建函数 alert("测试1"); } //test2();报错,函数还不存在 console.log(test2)//不会报错,变量提升只是提升变量的声明,并不会把赋值也提升上来,输出undefined var test2=function(){ alert("测试2"); };//使用函数表达式创建一个匿名函数(实际是以变量test3命名的函数) test2();//不会报错,以创建函数 var test3=function(){ alert("测试3"); }();//加了括号立即执行 var test4 = 12;// !注意看,一旦变量被赋值后,将会输出变量 //函数提升优先级高于变量提升,所以函数先提升,然后变量提升覆盖之前的函数声明,表 //现为变量 function test4() { alert("测试4"); } console.log(test4); //12 var test5="test5_1"; (function(){ //js中的变量搜索顺序:找变量时,先找局部变量,如果没有局部变量;再找全局变量。 alert(test5);//此时的test5为局部变量的提升,undefined var test5="test5_2"; })(); }
4.变量和函数同名,函数优先级高于变量,函数可以被赋值。例如:
console.log(a);
console.log(a());
var a=1;
function a(){
console.log(2);
}
a=3;
console.log(a);
console.log(a());
//解析如下
function a(){
console.log(2)
}
var a;
console.log(a); //这个时候是a()和a都存在,但是函数优先级高于变量所以下一个console打印的是a()
console.log(a());
a=1;
a=3;
console.log(a);
console.log(a()); //由于这个时候a()被覆盖了,所以报错