函数提升与变量提升比较类似,是指函数在声明之前即可被调用。
<script>// 调用函数foo();// 声明函数function foo() {console.log('声明之前即被调用...');}// 不存在提升现象bar();var bar = function () {console.log('函数表达式不存在提升现象...');}</script>
课堂代码:
// ------------------------- 简单体会函数提升 -----------------------// 代码运行时,会将函数的声明和创建提升到当前作用域的最前面(还要在提升的变量之前)// fn()// console.log(111)// console.log(222)// function fn() {// console.log('我会被提升到当前作用域的最前面')// }// -------------------------- 函数表达式 --------------------------// 函数表达式,实际上就是一个变量的声明,所以没有这样的函数提升,有的只是变量提示// fn1() // 报错,表达式函数,只是一个变量而已,不具有函数提示特点// let a = 1// let fn1 = function () {// console.log('我是函数,只是一个变量的值而已,所以把我当做变量对待')// }// ----------------------- 函数提升和变量提升同时存在 ------------------// 如果变量提升和函数提示同时存在,则函数提升更靠前console.log(abc) // 函数abcvar abc = 100function abc() {console.log('我是函数')}console.log(abc) // 100// ----------------------- 重新声明变量(不给值),则不会影响变量原来的值 ----------------// var a = 100// var a // 再次声明变量,但是没有给值,所以不会改变变量原来的值// console.log(a) // 100
总结:
- 函数提升能够使函数的声明调用更灵活
- 函数表达式不存在提升的现象
- 函数提升出现在相同作用域当中
