变量提升与函数提升

变量提升

变量提升是 JavaScript 中比较“奇怪”的现象,它允许在变量声明之前即被访问(仅存在于var声明变量

变量提升流程:

  1. 先把var 变量提升到当前作用域于最前面
  2. 只提升变量声明, 不提升变量赋值
  3. 然后依次执行代码

注意:

  1. 变量没有声明即被访问时会报语法错误

    Uncaught ReferenceError: 变量名 is not defined

  2. 变量在var声明之前即被访问,变量的值为 undefined

  3. let/const 声明的变量不存在变量提升

  4. 变量提升出现在相同作用域当中

  5. 实际开发中推荐先声明再访问变量

// 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
}

函数提升

函数提升与变量提升比较类似,是指函数在声明之前即可被调用。

总结:

  1. 函数提升能够使函数的声明调用更灵活

  2. 函数表达式不存在提升的现象

  3. 函数提升出现在相同作用域当中

// 函数提升
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

提升是针对声明的有名函数,匿名函数不可提升

posted @   丫丫learning  阅读(83)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示