变量提升
变量提升:
- 编译时到作用域的最前端声明并定义一个undefined值,变量赋值是在执行操作进行的
- 程序是一步一步往下执行的
console.log(a) //undefined
var a=1 //相当于var a编译过程声明a并定义undefined;a=1是在执行操作赋值
/******下面代码是上面代码js编译和执行的过程,抽象出来解释上面代码用的*******/
//编译后变量提升后的代码
var a=undefined;//提升到作用域的最前端
//执行时代码
console.log(a)//undefined
a=1;
函数提升
函数提升
1. 第一种:函数声明,使用函数声明的函数会存在函数提升,即将声明的函数提升到当前作用域顶部
showName(); //输出:函数被执行了
function showName(){
console.log('函数被执行了');
}
/********下面代码是上面代码js编译和执行的过程,抽象出来解释上面代码用的*********/
//编译后函数提升代码:在作用域的最前端
function showName(){
console.log('函数被执行了');
}
//可执行的代码
showName() //输出:函数被执行了
2. 第二种:函数表达式,使用函数表达式的函数会存在函数提升
showName(); //报错,showName is not a function
var showName=function(){
console.log('函数被执行了');
}
//函数都有被调用的功能,但是代码都是一行行执行。所以输出error
/*******下面代码是上面代码js编译和执行的过程,抽象出来解释上面代码用的*******/
//编译后函数提升代码:在作用域的最顶端
var showName=undefined;
//可执行的代码
showName();
showName=function(){
console.log('函数被执行了'); //报错,showName is not a function
}
//把showName()改成consol.log(showName)
console.log(showName); //输出undefined,可解释上面那段代码提升是把声明了showName并给了undefined值
var showName=function(){
console.log('函数被执行了');
}
下面我们来聊聊函数提升和变量提升的优先级
下面我们来聊聊函数提升和变量提升的优先级
console.log(f); //[funtion: f] 输出的是一个函数体方式
console.log(f()); //undefined 没有返回值所以输出undefined
var f=10;
function f(){
var a;
console.log(a); //undefined
a=10
console.log(a); //10
}
结合我们上面变量提升和函数提升,如果以我们上面聊的为准,那么第一个log本来应该输出undefined,但现在确输出了一个函数体方式,这就说明我们的函数提升大于变量提升。
总结
以下上面所聊到的:
- 变量提升和函数提升,我们有一个作用域专门存放变量提升(编译后)的值,并且编译时会把提升调到作用域的顶端。
- 文件的执行顺序是由上往下顺序执行的
- 函数提升的优先级大于变量提升
- 变量提升时只会声明,并不会赋值提升
- 有多个同名变量声明时,函数声明会覆盖其他的声明
- 有多个同名函数声明,则是由最后的一个函数声明覆盖之前所有的声明。