变量和函数提升
变量声明提升
使用var关键字声明的变量,会在所有的代码执行之前被声明但不会被赋值,在定义域之前就能访问到,只不过是undefined,但是如果声明变量时不是var关键字,则变量不会被声明提前。
<script>
console.log(a)//undefined
var a=10
</script>
变量提升后,这个代码就相当于
<script>
var a
console.log(window.a)
a=10
</script>
如果是以下代码就会报错
<script>
console.log(a)//因为这里就是没有var声明,变量不会提升导致报错,
a=10
</script>
函数声明提升
<script>
fun()//正常打印输出
fun2()//报错,undefined is not a function
function fun(){
console.log("我是一个fun函数")
}
var fun2=function (){
console.log("我是一个fun2函数")
}
</script>
这是因为使用函数声明形式创建的函数function 函数( ){} ,它会在所有的代码执行之前就被创建,即他的代码相当于
<script>
function fun(){
console.log("我是一个fun函数")
}//函数声明提升,永远在最前面
fun()
</script>
而使用函数表达式创建的函数,不会被声明提前(变量赋值会覆盖函数提升),所以不能在声明前调用,即fun2函数的代码相当于
<script>
var fun2
console.log(fun2)//此时打印的结果是undefined
fun2()//那么这个地方调用肯定会报错undefined is not a function
fun2=function (){
console.log("我是一个fun2函数")
}
</script>
3.函数先提升,变量后提升,变量提升不会覆盖函数提升,变量赋值会覆盖函数提升