js中,变量提升在前还是函数提升在前?

百度的文章里有说函数声明提升在前的,也有说变量提升在前的,到底谁在前呢?求教

阅读 6.5k
7 个回答

变量提升是发生在创建变量对象的过程中,会先扫描函数声明,再扫描变量声明,如果变量名与已经声明的函数相同,此时什么都不会发生,变量声明不会干扰已经存在的这个同名属性

console.log(name);//ƒ name(){console.log('cc');}
console.log(age);//ƒ age(){console.log(18);}
var name = 'cc';
function age(){
    console.log(18);
}
function name(){
    console.log('cc');
}

可以看下这个哦JavaScript基础系列---执行环境与作用域链

兄弟,函数在JS中属于一级公民,函数在前

猜想按照书写顺序解释执行的吧,实践测试一下

首先变量提升只发生在var声明的时候,用let和const就没这么多问题了
另外这个谁先谁后其实不影响什么,不过硬要说谁先,那么是函数,为什么?因为这是规范。。。

按顺序提升,function 定义的在提升阶段就给变量赋值了,所以后定义的会覆盖前面定义的变量的值。var 定义的变量在提升阶段不会赋值,只会提升变量定义,如果变量在提升阶段已经由其他 var 定义或者 funciton 定义,则它不产生任何影响,所以也不存在覆盖前面提升的值的问题。var语句在执行阶段才会进行真正的赋值,所以console.log的值实际是执行阶段的结果。

console.log(foo)
function foo(){
    console.log('bb')
}
function foo(){
    console.log('cc')
}
var foo = 'aa'
console.log(foo)

用 let 来证明确实是按顺序提升

function test(){
   function foo(){}
   let foo;
}
test(); // 报错提示第三行 let foo处标识符重复定义

function test2(){
   let foo;
   function foo(){}
}
test2(); // 报错提示第三行 function foo()处标识符重复定义

如果函数提升在前,那 test2 应该报错第二行。

  1. 同名变量只会被声明一次
  2. 函数是js的一等公民, 会优先编译 并覆盖同名变量的声明

所以打印出来的都是函数 不是undefined

函数声明提升在前

比如:

console.log(foo)
var foo = 'aa'
function foo(){
    console.log('bb')
}
输出 
ƒ foo() {
    console.log('bb')
}

把 var foo = 'aa' 放在后面输出结果相同
推荐问题
宣传栏