1、变量提升
在es6之前没有块级作用域(即一对{}就为一个块级作用域),再此之前只有全局作用域和函数作用域,
(1)函数提升
创建函数方式:函数声明、函数字面量,只有函数声明有函数提升
console.log(a) // [Function: a]
console.log(b) // undefined
function a() {
console.log('@@@')
}
var b = function () {
console.log('---')
}
相当于:
var a = function (){
console.log('@@@')
}
var b
console.log(a)
console.log(b)
b = function () {
console.log('---')
}
(2)变量提升
console.log('a1', a) //undefined
var a = 1
console.log('a2', a) //1
function c() {
console.log(b) //undefined
var b = 2
console.log(b) //2
}
c()
函数提升与变量提升的优先级
函数提升的优先级要比变量的优先级要高:
console.log(a) //[Function: a]
console.log(a()) // @ undefined
var a = 1
function a () {
console.log('@')
}
console.log(a) //1
由此得出函数提升要比变量提升要高一些,而且不会被变量声明覆盖,但是会在变量赋值后被覆盖