变量提升
更详细的说是用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'
这两种结果都相同,不可否认函数的优先级高,但是变量和函数谁先提升我还不知道,有什么办法能辨别吗?