变量提升和函数提升

111 阅读2分钟

变量提升

更详细的说是用var声明的变量的提升。而且只是提升变量的声明,没有提升变量的赋值。

切记let和const就没有变量提升了,如果专门问我let和const有没有变量提升,我也知道没有,但是有时候脑残,用let声明的变量测试变量提升(捂脸)

console.log(a);                   // undefined
var a = 'aa'

等同于

var a
console.log(a);
a = 'aa'

切记:变量提升 是var a不是var a = undefined,两者有不同,前者a的值可能是undefined,也可能是其他值(如果变量a在前面有赋值的话);后者a的强制转换为undefined,不管你前面是否赋值

还有用var fn = function(){},这种形式声明的函数也是变量提升

console.log(a);                    // undefined
var a = function(){
    console.log('aa');
}

等同于

var a
console.log(a);                       // undefined
a = function(){
    console.log('aa');
}

函数提升

a()                               // 输出'aa'
function a(){
    console.log('aa');
}

等同于

function a(){
    console.log('aa');
}
a()                               // 输出'aa'

变量提升和函数提升谁优先级高

之前对变量提升与函数提升的了解只停留在这,突然我就想万一变量和函数同名了,他俩都提升,谁先提升谁后提升呢谁优先级高呢?

总结:我也不知道谁先进行,但是不管谁先进行都不影响最后结果。变量提升 提升声明,不提升赋值;函数提升 提升声明和赋值。赋值之后的function a(){}不会被var a所覆盖。所以函数的优先级更高

先看下面一段代码理解一下上面那句话

function a() {}
var a
console.log(a);       // [Function: a]
a = 'aa'
console.log(a);       // aa

这里说明同名函数不会被后面的同名变量声明覆盖,但会被同名变量赋值后覆盖

console.log(a);        // [Function: a]
function a(){}
var a = 'aa'

等价于

var a
function a(){}
console.log(a);       // [Function: a]
a = 'aa'function a(){}
var a
console.log(a);        // [Function: a]
a = 'aa'

这两种结果都相同,不可否认函数的优先级高,但是变量和函数谁先提升我还不知道,有什么办法能辨别吗?