函数提升与变量提升比较类似,是指函数在声明之前即可被调用。
<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) // 函数abc
var abc = 100
function abc() {
console.log('我是函数')
}
console.log(abc) // 100
// ----------------------- 重新声明变量(不给值),则不会影响变量原来的值 ----------------
// var a = 100
// var a // 再次声明变量,但是没有给值,所以不会改变变量原来的值
// console.log(a) // 100
总结:
- 函数提升能够使函数的声明调用更灵活
- 函数表达式不存在提升的现象
- 函数提升出现在相同作用域当中