当前位置: 首页 > news >正文

什么是变量提升?

变量提升(Hoisting) 是 JavaScript 引擎在代码执行前的一个特殊行为,它会将变量声明和函数声明自动移动到当前作用域的顶部。但需要注意的是,只有声明会被提升,赋值操作不会提升。


​核心概念​

  1. 变量声明提升(仅 var 和函数参数):
    • 用 var 声明的变量会被提升到作用域顶部,但赋值留在原地。

    • 用 letconst 声明的变量也会被提升,但不会初始化,导致暂时性死区(TDZ)。

  2. 函数声明提升:
    • 函数声明(非函数表达式)整体被提升,包括函数体。


​示例代码​

  1. var 的变量提升
 

javascript

复制

console.log(a); // 输出 undefined(变量声明被提升,但未赋值)
var a = 10;

等价于:

 

javascript

复制

var a;          // 声明提升到顶部
console.log(a); // undefined
a = 10;         // 赋值留在原地
  1. letconst 的暂时性死区
 

javascript

复制

console.log(b); // 报错:Cannot access 'b' before initialization
let b = 20;

虽然 b 的声明被提升,但在声明前访问会触发错误。

  1. 函数声明提升
 

javascript

复制

foo(); // 输出 "Hello"
function foo() {console.log("Hello");
}

等价于:

 

javascript

复制

function foo() { // 函数声明整体提升console.log("Hello");
}
foo();

​注意事项​

  1. 函数表达式不会被提升:

     

    javascript

    复制

    bar(); // 报错:bar is not a function
    var bar = function() { /* ... */ };

    此时 bar 是变量,提升的是变量声明(值为 undefined)。

  2. 函数声明优先级高于变量声明:

     

    javascript

    复制

    console.log(typeof a); // 输出 "function"
    var a = 3;
    function a() {}

​为什么会有变量提升?​
JavaScript 引擎在执行代码前会经历两个阶段:

  1. 编译阶段:解析代码,提升变量和函数声明。
  2. 执行阶段:逐行执行代码。

​如何避免问题?​

  1. 优先使用 letconst:避免 var 的隐式全局变量和提升问题。
  2. 声明变量时先写后用:
     

    javascript

    复制

    let c = 30;
    console.log(c); // 正常输出 30
  3. 使用严格模式("use strict"):禁止意外的全局变量。

​总结​
• 变量提升是 JavaScript 的历史遗留特性,可能导致意外行为。

var 会提升声明但初始化为 undefinedlet/const 存在暂时性死区。

• 函数声明整体提升,函数表达式不会被提升。

• 现代开发中推荐使用 let/const 和函数表达式(箭头函数)来规避问题。

相关文章:

  • C++-缺省参数
  • 菊厂笔试1
  • 电子电器架构 --- 电气/电子架构如何发展以满足其处理和传感器融合需求
  • CAN总线通讯接口卡:工业通信的核心桥梁
  • 在UI原型设计中,低、高保真原型图有什么区别?
  • 验证码(笔记)
  • web 自动化之 Selenium 元素定位和浏览器操作
  • 数据结构 - 10( B- 树 B+ 树 B* 树 4000 字详解 )
  • Node.js 技术原理分析系列9——Node.js addon一文通
  • AI开发跃迁指南(第三章:第四维度1——Milvus、weaviate、redis等向量数据库介绍及对比选型)
  • 腾讯云:数字世界的“量子熔炉”与硅基文明引擎​
  • LeetCode 热题 100 238. 除自身以外数组的乘积
  • 16011.自动分簇KMeans算法
  • element MessageBox 实现底部三个按钮或者更多按钮—开箱即用
  • 【MySQL】第二弹——MySQL表的增删改查(CURD))
  • 【MySQL】存储引擎 - MEMORY详解
  • 使用 CDN 在国内加载本地 PDF 文件并处理批注:PDF.js 5.x 实战指南
  • Ubuntu 安装 Nginx
  • 【hadoop】案例:Sqoop迁移仓库数据
  • OpenTelemetry 介绍
  • 新买宝马竟是“维修车”,男子发视频维权被4S店索赔100万
  • 印巴战火LIVE丨印巴互相发动无人机袭击,巴官员称两国已在国安层面接触
  • 两部门发布山洪灾害气象预警:北京西部、河北西部等局地山洪可能性较大
  • 视频丨习近平同普京会谈:共同弘扬正确二战史观,维护联合国权威和地位
  • 国家主席习近平同普京总统举行大范围会谈
  • 习近平同俄罗斯总统普京举行会谈