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;// !注意看,一旦变量被赋值后,将会输出变量.
//如果变量未赋值,将输出函数,相当于 var a=function(){console.log(100);}; var a; a();//100
//函数提升优先级高于变量提升,所以函数先提升,然后变量提升覆盖之前的函数声明,表
//现为变量
function test4() {
alert("测试4");
}
console.log(test4); //12
var test5="test5_1";
(function(){//自执行匿名函数
//js中的变量搜索顺序:找变量时,先找局部变量,如果没有局部变量;再找全局变量。
alert(test5);//此时的test5为局部变量的提升,undefined
var test5="test5_2";
})();
}
注意:
1:变量赋值并没有被提升,只是声明被提升了,此时的输出提升的变量为undefined。
但是,函数的声明不一样,函数体也会一同被提升。
2:js中的变量搜索顺序:找变量时,先找局部变量,如果没有局部变量;再找全局变量。(注意,局部的变量提升)
3:js中函数提升优先级高于变量提升(同名变量和函数,函数先提升之后变量提升,后面变量的赋值会将同名函数覆盖,而函数体已提升,不会再执行函数体覆盖变量值)。