简介:本文先从函数的声明方式说起,介绍不同函数的声明方式在函数声明提升上的不同。然后根据具体的例子比较变量声明提升和函数声明提升的不同。
第一部分:函数的声明方式
函数声明有三种方式:函数声明,函数表达式(又称函数字面量声明),函数对象的声明(使用率很低)
方式一:函数声明
function 函数名(形参列表){
//方法体
}
方式二:函数表达式(又称函数字面量声明)
var 变量名=function 函数名(形参列表){ 备注:这个函数名有点特别,它只能在它自己这个函数体内被调用。不能被外部访问,有兴趣的自己测试测试。
//方法体
}
方式三:函数对象的声明
var 方法名 =new Function("形参1","形参2","形参3", "方法体");
只有函数声明才会函数声明提升,其他两种不会函数声明提升。
三种不同的函数声明方式
<script>
function test0 (){
return 0
}
var test1;
var test2 ;
alert(test0)//function (){return 1}
alert(test1)//undefined
alert(test2)//undefined
test1 = function (){
return 1
}
test2 = new Function ( "return 2")
</script>
上面的代码才是真正的js执行顺序。这里面的test1和test2提升是作为变量提升的。
第二部分:函数声明提升和变量声明提升
<script>
function test(){
alert(typeof(test0))//string
}
function test0 (){
return 0
}
var test0
alert(typeof(test0))//function
test0 ="Hello world!";
alert(typeof(test0))//string
</script>
上面是代码的真正执行顺序。不论变量的声明在变量的同名函数之前还是之后,变量的同名函数的提升都在变量的提升之前。那么不同名的情况下,变量的提升和函数的提升会是怎么样的。根据官网的说法上,函数的提升都会在变量提升之前(我没想到验证函数和变量不同名时候怎么验证提升的先后顺序)。
其实,我觉得搞懂这些一点用都没有。这里说一下我对变量提升问题的理解,首先JS是弱类型脚本语言,那么如果我们把function test0看做一个确定了类型的变量,这个变量类型是function,变量名为test0。这样一个确定了类型的变量,就应该先被JS写入内存中,对于那些var 声明的变量,test0的作用和类型更明确。只有变量覆盖函数,函数不可能覆盖变量,因为函数的声明提升永远在最上面。
鸣谢:https://blog.csdn.net/qq673318522/article/details/50810650