深入理解JS中的函数声明提升和变量声明提升

简介:本文先从函数的声明方式说起,介绍不同函数的声明方式在函数声明提升上的不同。然后根据具体的例子比较变量声明提升和函数声明提升的不同。

第一部分:函数的声明方式

函数声明有三种方式:函数声明,函数表达式(又称函数字面量声明),函数对象的声明(使用率很低)

   方式一:函数声明
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

猜你喜欢

转载自blog.csdn.net/cauchy6317/article/details/81148017