var变量提升
console.log(a)//打印undefined
var a = 123
console.log(a)//未定义该属性
a = 123
这是为什么呢?
- 使用var关键字声明的变量会在所有的代码执行之前被声明,但不会赋值,所以是undefined
- 如果声明变量不使用var关键字,则变量不会被声明提前
所以第一段代码等同于
var a
console.log(a)//a
a = 123
函数的声明提前
fun()//我是fun
fun2()//undefined is not a function
function fun(){
console.log("我是fun")
}
var fun2 = function(){
console.log("我是fun2")
}
- fun2是由var声明的,所以变量提升,var fun2 = undefined
- function 函数名(){}形式的声明是函数提升式声明,它会在所有代码执行之前就被创建,所以我们可以在函数声明前来调用函数
当变量提升和函数提升同名时
console.log(a)//打印a函数
function a(){
console.log("我是函数声明提升")
}
var a = "我是变量声明提升"
结论:当变量声明提升和函数声明提升同名时,函数声明提升优先于变量声明提升