函数和变量的提升以及优先级(请大佬指教)

285 阅读3分钟

变量提升

变量提升:

  1. 编译时到作用域的最前端声明并定义一个undefined值,变量赋值是在执行操作进行的
  2. 程序是一步一步往下执行的
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,但现在确输出了一个函数体方式,这就说明我们的函数提升大于变量提升。

总结

以下上面所聊到的:

  1. 变量提升和函数提升,我们有一个作用域专门存放变量提升(编译后)的值,并且编译时会把提升调到作用域的顶端。
  2. 文件的执行顺序是由上往下顺序执行的
  3. 函数提升的优先级大于变量提升
  4. 变量提升时只会声明,并不会赋值提升
  5. 有多个同名变量声明时,函数声明会覆盖其他的声明
  6. 有多个同名函数声明,则是由最后的一个函数声明覆盖之前所有的声明。