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