1.什么是变量提升?

JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。

JavaScript 中,变量可以在使用后声明,也就是变量可以先使用再声明。
 

例如:先使用后声明

console.log(a) // undefined
var a = 2

相当于:
var a;
console.log(a); // undefined
a = 2;

2.表达式与函数声明提升时的差异?

// 函数声明
function funDeclaration(type){
    return type==="Declaration";
}
// 函数表达式
 var funExpression = function(type){
     return type==="Expression";
}

函数表达式和函数声明的区别:

1.函数声明在JS解析时进行函数提升,因此在同一个作用域内,不管函数声明在哪里定义,该函数都可以进行调用。
2.函数表达式的值是在JS运行时确定,并且在表达式赋值完成后,该函数才能调用。
3.函数声明可以先调用再声明,而函数表达式必须先定义再调用。

4. 函数声明 和 函数表达式,在定义前使用的区别?

函数声明:

在定义前使用,依然可以获取到函数声明里面的值。

 foo()  // 1
 function foo() {
   console.log('1')
 }

函数表达式:

而函数表达式执行时则不然,只会将变量提升,暂赋值undefined,赋值或其他逻辑运行会留在原地

  test(); // Uncaught TypeError: test is not a function

  var test = function () {
    console.log('函数表达式=', 111);
  }

5.函数声明优先于表达式?

一:遇到同名的变量提升则被会略

foo() // 3
var foo = 5;   
function foo() {
  console.log('3')
}

foo()函数声明,在遇到同名的变量声明var foo = 5; 

则函数声明会忽略变量声明,直接赋值函数声明的值。

 

二:遇到同名的函数变量,后面的会覆盖前面的函数声明

foo() // 4
function foo() {
  console.log('3')
}
function foo() {
  console.log('4')
}

三:在执行过程中,由于函数声明以及本身在编译时被提升到当前作用域的顶端,运行过程中遇到同名表达式,则函数表达式会覆盖函数声明。

 var test = function () {
    console.log('函数表达式=', 111);
  }
  function test() {
    console.log('函数声明=', 222)
  }

  test();    // 函数表达式=111

参考:https://zhuanlan.zhihu.com/p/139644982

 

posted on 2020-11-27 10:14  liumcb  阅读(166)  评论(0编辑  收藏  举报