变量提升与函数提升
变量提升
变量提升是 JavaScript 中比较“奇怪”的现象,它允许在变量声明之前即被访问(仅存在于var声明变量)
变量提升流程:
- 先把var 变量提升到当前作用域于最前面
- 只提升变量声明, 不提升变量赋值
- 然后依次执行代码
注意:
-
变量没有声明即被访问时会报语法错误
Uncaught ReferenceError: 变量名 is not defined
-
变量在var声明之前即被访问,变量的值为 undefined
-
let/const 声明的变量不存在变量提升
-
变量提升出现在相同作用域当中
-
实际开发中推荐先声明再访问变量
// var n console.log(n)//undefined var n = 123 console.log(n)//123 function fn () { // var n console.log(n)//undefined var n = 666 console.log(n)//666 } // 函数调用时,预解析,首先查找当前作用域是否声明变量,声明了,预解析声明的变量,放在当前作用域最前面 fn()
预解析:代码执行前先要预解析(调用才预解析)
变量:带有声明的变量会有预解析
把变量的声明语法提升到当前作用域的最前面
注意:只定义不赋值,也称为变量提升
函数:带有名字的函数
把函数的声明语法,提到当前作用域最前面
注意:只定义不调用,也称为函数提升
// 预解析,放在当前作用域最前面 /* 预解析 var a var b */ // 函数调用时,函数预解析,函数提升 /* 预解析 function fn() { // 变量提升 var b = 20 var a console.log(a)//undefined console.log(b)//20 var a = 10 } */ var a = 1 var b = 2 fn() function fn() { var b = 20 console.log(a)//undefined console.log(b)//20 var a = 10 }
函数提升
函数提升与变量提升比较类似,是指函数在声明之前即可被调用。
总结:
-
函数提升能够使函数的声明调用更灵活
-
函数表达式不存在提升的现象
-
函数提升出现在相同作用域当中
// 函数提升 fn() function fn () { console.log(123) } // 函数表达式不能提升,需要先声明,再使用 // // const f = function () { // console.log(222) // } // f() // 函数优于变量 // 变量与函数同名时,函数优于变量 /* a:函数 a:变量 */ console.log(a) /* 控制台打印 ƒ a () { console.log('a') } */ function a () { console.log('a') } var a = 1 console.log(a)//1
提升是针对声明的有名函数,匿名函数不可提升
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性