函数提升、变量提升和他们的优先级

382 阅读1分钟

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

由此得出函数提升要比变量提升要高一些,而且不会被变量声明覆盖,但是会在变量赋值后被覆盖