JavaScript变量提升与作用域揭秘(你不知道的执行机制内幕)

第一章:JavaScript变量提升与作用域揭秘

变量提升的本质

JavaScript在执行代码前会进行“编译”阶段,此时会将所有通过var声明的变量和函数声明提升到当前作用域的顶部。这意味着即使变量在代码后面定义,也可以在前面访问,但其值为undefined。

// 变量提升示例
console.log(name); // 输出: undefined
var name = "Alice";

// 实际等价于:
var name;
console.log(name); // undefined
name = "Alice";

函数声明与变量提升的优先级

函数声明的提升优先级高于变量声明。如果变量名与函数名相同,函数声明会覆盖变量声明。

  • 函数声明会被整体提升
  • 变量提升仅提升声明,不提升赋值
  • let 和 const 虽然也存在暂时性死区,但不会被提升到作用域顶部

作用域链的形成机制

JavaScript采用词法作用域,函数的作用域在定义时确定,而非调用时。内部函数可以访问外部函数的变量,形成作用域链。

声明方式是否提升初始值
var是undefined
let否(存在暂时性死区)未初始化
const否(存在暂时性死区)必须初始化
// 作用域链示例
function outer() {
  const a = 10;
  function inner() {
    console.log(a); // 访问外层作用域的 a
  }
  inner();
}
outer(); // 输出: 10

第二章:变量提升的底层机制解析

2.1 变量声明与函数声明的提升优先级

JavaScript引擎在执行代码前会进行变量和函数的提升(Hoisting),但它们的优先级不同。函数声明的提升优先级高于变量声明。
提升顺序规则
  • 函数声明会被整体提升到作用域顶部
  • 变量声明仅提升声明,不提升赋值
  • 同名标识符中,函数声明优先于变量声明被提升
代码示例与分析

console.log(foo); // 输出:function foo() {}
var foo = 1;
function foo() {}
上述代码中,尽管var foo出现在函数声明之前,但由于函数提升优先级更高,foo在初始化阶段即被赋予函数定义。随后的变量赋值仍会覆盖该函数值,因此后续输出为1。
优先级对比表
声明类型提升内容优先级
函数声明整个函数高
变量声明仅声明低

2.2 var、let、const在提升行为上的差异

JavaScript中的变量声明方式直接影响其提升(hoisting)行为。`var`声明的变量会被提升至函数作用域顶部,并初始化为`undefined`;而`let`和`const`同样存在提升,但不会被初始化,进入“暂时性死区”(Temporal Dead Zone),直到声明语句执行。
提升行为对比示例

console.log(a); // undefined
var a = 1;

console.log(b); // ReferenceError
let b = 2;

console.log(c); // ReferenceError
const c = 3;
上述代码中,`var`允许访问未初始化的值,而`let`和`const`在声明前访问会抛出错误,体现更严格的时序控制。
声明特性总结
声明方式提升初始化重复声明
var是undefined允许
let是否(TDZ)不允许
const是否(TDZ)不允许

2.3 函数表达式与函数声明的提升对比

JavaScript 中的函数声明和函数表达式在变量提升(hoisting)行为上存在显著差异。
函数声明的提升机制
函数声明会被完整地提升到其作用域顶部,包括函数名和函数体。

console.log(add(2, 3)); // 输出: 5
function add(a, b) {
    return a + b;
}
上述代码能正常执行,因为 add 函数在整个作用域内被提前定义。
函数表达式的提升行为
而函数表达式仅变量名被提升,函数体不会被提升。

console.log(multiply(2, 3)); // 报错: Cannot access 'multiply' before initialization
const multiply = function(a, b) {
    return a * b;
};
此处 multiply 被提升为未初始化的绑定,访问时会抛出错误。
  • 函数声明:完全提升,可先调用后定义
  • 函数表达式:部分提升,必须先定义后调用

2.4 变量重复声明时的执行上下文处理

在JavaScript中,变量重复声明的行为因声明方式不同而异。使用var声明的变量在同一作用域内可重复声明,而let和const则会抛出语法错误。
声明方式对比
  • var:允许重复声明,变量提升至函数作用域顶部
  • let:禁止重复声明,存在暂时性死区(TDZ)
  • const:同let,且必须初始化
代码示例与分析

function example() {
  var a = 1;
  var a = 2; // 合法
  let b = 3;
  // let b = 4; // SyntaxError: 重复声明
  console.log(a, b); // 输出: 2 3
}
example();
上述代码中,var a被多次声明并覆盖,而let b若重复声明将触发错误,体现了块级作用域的严格性。

2.5 实战演练:从错误案例看提升陷阱

在实际开发中,常见的性能瓶颈往往源于对底层机制的误解。以数据库批量插入为例,若采用循环单条插入,将显著降低效率。
// 错误示例:循环执行 INSERT
for _, user := range users {
    db.Exec("INSERT INTO users(name, age) VALUES(?, ?)", user.Name, user.Age)
}
上述代码每轮循环都建立一次数据库通信,开销巨大。正确做法是使用批量插入或事务封装:
// 正确示例:使用事务批量提交
tx, _ := db.Begin()
stmt, _ := tx.Prepare("INSERT INTO users(name, age) VALUES(?, ?)")
for _, user := range users {
    stmt.Exec(user.Name, user.Age)
}
tx.Commit()
通过预处理语句(Prepare)与事务结合,将多次通信合并为一次连接,极大提升吞吐量。同时,应避免在循环中进行日志输出或嵌套查询,防止时间复杂度飙升。

第三章:作用域链与词法环境探秘

3.1 词法作用域的静态性特征分析

词法作用域(Lexical Scoping)的核心在于其静态性,即变量的访问权限在代码编写阶段就已确定,而非运行时动态决定。
作用域链的构建时机
函数定义时,其外部作用域被静态绑定,形成固定的作用域链。无论函数在何处调用,查找变量始终沿定义时的嵌套结构向上追溯。

function outer() {
    let x = 10;
    function inner() {
        console.log(x); // 输出 10,访问的是 outer 定义时的 x
    }
    return inner;
}
const fn = outer();
fn(); // 即便 outer 已执行完毕,inner 仍能访问其词法环境
上述代码中,inner 函数在定义时就绑定了 outer 的作用域,这种绑定不会因调用位置改变而失效,体现了词法作用域的静态特性。
与动态作用域的对比
  • 词法作用域:依据代码结构静态决定,编译期可分析
  • 动态作用域:依据调用栈动态决定,运行时才确定

3.2 执行上下文中的作用域链示例解析

在JavaScript执行上下文中,作用域链决定了变量的查找规则。每当函数被调用时,会创建一个执行上下文,并生成对应的作用域链。
作用域链示例代码

function outer() {
    const a = 10;
    function inner() {
        console.log(a); // 输出 10
    }
    inner();
}
outer();
上述代码中,inner 函数内部没有定义变量 a,因此沿着作用域链向上查找,在其外层函数 outer 的变量环境中找到 a。
作用域链的结构构成
  • 当前执行上下文的变量对象(如函数内的局部变量)
  • 外层函数作用域的变量对象
  • 全局执行上下文的变量对象
该链式结构确保了变量按层级从内向外逐级查找,直到全局作用域为止。

3.3 块级作用域如何改变变量访问规则

在 ES6 引入 `let` 和 `const` 之前,JavaScript 仅支持函数级作用域,变量容易因提升(hoisting)而产生意外访问。块级作用域的引入,使得变量的生命周期被严格限制在 `{}` 内部。
块级作用域的基本行为
使用 `let` 或 `const` 声明的变量只能在声明它的代码块内访问:

{
  let blockVar = 'I am scoped to this block';
  const PI = 3.14;
}
console.log(blockVar); // ReferenceError: blockVar is not defined
上述代码中,blockVar 和 PI 在块外无法访问,避免了全局污染和变量覆盖问题。
与 var 的对比
  • var 声明存在变量提升,可在声明前访问(值为 undefined);
  • let/const 存在暂时性死区(TDZ),在声明前访问会抛出错误;
  • const 要求声明时初始化,且不可重新赋值。
这一机制显著提升了代码的安全性和可维护性。

第四章:闭包与执行上下文深度剖析

4.1 闭包形成机制及其内存影响

闭包是函数与其词法作用域的组合,当内部函数引用外部函数的变量时,便形成了闭包。即使外部函数执行完毕,其变量仍被内部函数引用,导致无法被垃圾回收。
闭包的基本结构
function outer() {
    let count = 0;
    return function inner() {
        count++;
        return count;
    };
}
const counter = outer();
console.log(counter()); // 1
console.log(counter()); // 2
上述代码中,inner 函数持有对 count 的引用,因此 outer 的执行上下文虽已退出,但 count 仍驻留在内存中。
内存影响分析
  • 闭包延长了外部变量的生命周期,可能导致内存泄漏
  • 频繁创建闭包且未妥善释放,会增加内存占用
  • 合理使用可实现数据私有化,但需警惕意外的引用残留

4.2 通过闭包实现私有变量的实践应用

在JavaScript中,闭包可用于封装私有变量,避免全局污染并增强模块安全性。通过函数作用域隔离数据,仅暴露必要的接口。
基本实现模式

function createCounter() {
    let privateCount = 0; // 私有变量
    return {
        increment: function() {
            privateCount++;
        },
        getCount: function() {
            return privateCount;
        }
    };
}
const counter = createCounter();
counter.increment();
console.log(counter.getCount()); // 输出: 1
上述代码中,privateCount 无法被外部直接访问,只能通过闭包暴露的方法操作,实现了数据的封装与保护。
应用场景
  • 模块化开发中的配置隐藏
  • 缓存机制的私有存储
  • 状态管理中的受控变更

4.3 调试作用域链:理解[[Environment]]引用

JavaScript 执行上下文中的作用域链由内部的 [[Environment]] 引用维护,它指向词法环境中外层作用域的引用。
作用域链的构建时机
函数在创建时便捕获当前的词法环境,而非调用时。这一机制构成了闭包的基础。
function outer() {
    let x = 10;
    function inner() {
        console.log(x); // 访问外部变量
    }
    return inner;
}
const fn = outer();
fn(); // 输出: 10
上述代码中,inner 函数的 [[Environment]] 指向 outer 函数的作用域,即使 outer 已执行完毕,该引用仍保持有效。
调试技巧
使用浏览器开发者工具查看闭包作用域,可在“Scope”面板中观察到 Closure 条目,清晰展示 [[Environment]] 所保留的变量。

4.4 经典面试题实战:循环中的闭包问题解决

在JavaScript开发中,循环结合闭包的使用常常引发意料之外的行为,尤其在异步操作中尤为典型。
问题重现
以下代码常作为面试题考察对作用域的理解:

for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100);
}
// 输出:3 3 3
由于var声明的变量具有函数作用域,且setTimeout回调共享同一外层作用域,最终输出均为循环结束后的i值。
解决方案对比
  • 使用let创建块级作用域:

for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 100);
}
// 输出:0 1 2
let在每次迭代时创建新绑定,形成独立的词法环境。
  • 通过立即执行函数(IIFE)手动绑定:

for (var i = 0; i < 3; i++) {
  (function (index) {
    setTimeout(() => console.log(index), 100);
  })(i);
}
利用函数参数捕获当前i值,实现闭包隔离。

第五章:总结与进阶学习建议

持续构建实战项目以巩固技能
真实项目是检验技术掌握程度的最佳方式。建议从微服务架构入手,尝试使用 Go 构建一个具备 JWT 鉴权、REST API 和 PostgreSQL 持久化的用户管理系统。

package main

import (
    "net/http"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{
            "message": "pong",
        })
    })
    r.Run(":8080")
}
深入理解系统设计与性能调优
掌握高并发场景下的限流、缓存穿透与雪崩问题至关重要。可结合 Redis 实现分布式锁,并通过 Sentinel 或 Redis Cluster 提升可用性。
  • 学习使用 Prometheus + Grafana 监控服务指标
  • 实践 gRPC 替代传统 HTTP 以提升内部服务通信效率
  • 掌握 Docker 多阶段构建优化镜像体积
参与开源社区与代码贡献
加入 CNCF 或 GitHub 上活跃的 Go 项目(如 Kubernetes、Terraform),阅读源码并提交 PR。这不仅能提升代码质量意识,还能深入理解大型项目的设计模式。
学习方向推荐资源实践目标
云原生架构《Designing Distributed Systems》部署基于 Operator 的自愈应用
性能分析Go pprof 工具链完成一次线上服务 CPU 分析与优化
【高频考点精讲】闭包与作用域链的深度解析:从变量提升到块级作用域,掌握JS执行机制 写出更可靠的代码避免常见陷阱设计更优雅的架构轻松应对相关面试题最后留个思考题:如何用闭包实现一个只能调用一次的函数?欢迎在评论区分享你的实现,全栈老李会挑选有趣的做法进行解析。 阅读详情

相关推荐

JavaScript变量提升与作用域底层机制解析

JavaScript中的变量声明并非简单的语法行为,而是运行时引擎(如V8)在执行上下文创建阶段对绑定(binding)进行内存分配与状态标记的核心机制。其本质涉及词法环境、变量环境、暂时性死区(TDZ)及作用域链的协同运作。var、let、const 三者差异不在表面关键字,而在于绑定初始化时机与作用域边界——这直接决定ReferenceError是否抛出、闭包能否正确捕获、以及异步逻辑中变量值的确定性。理解该机制,是排查微信小程序scope权限报错、React/Vue响应式失效、Node内存泄漏等工程问

dht91597的博客 703

JavaScript的执行机制——块级作用域

块级作用域作用域(scope)变量提升所带来的问题变量容易在不被察觉的情况下被覆盖掉本应销毁的变量没有被销毁ES6 是如何解决变量提升带来的缺陷JavaScript 是如何支持块级作用域的 作用域(scope) 为什么 JavaScript 中会存在变量提升这个特性,而其他语言似乎都没有这个特性呢?要讲清楚这个问题,我们就得先从作用域讲起。 作用域是指在程序中定义变量的区域,该位置决定了变量的生命周期。通俗地理解,作用域就是变量与函数的可访问范围,即作用域控制着变量和函数的可见性和生命周期。 在 ES6 之

前端探险家的博客 2914

JavaScript 中的变量提升与作用域

变量提升是JavaScript中的一个重要概念,它揭示了变量和函数声明在执行前逻辑上的“提前”,但实际只涉及声明部分。作用域界定了变量存在的上下文环境,确定了变量的生命周期与可访问范围。从全局作用域到函数作用域,再到let和const引入的块级作用域,每个层次都精细控制着变量的可见性。

Allen- 2537

Javascript变量作用域、变量提升

Javascript变量、变量提升以及作用域 执行环境对js编程的重要性不容忽视,理解其执行的原理,将有效提升编程素养。

hbzyin的博客 3044

XC7Z010-1CLG400C开发板ADC引脚配置全攻略(附完整引脚列表)

本文详细解析了XC7Z010-1CLG400C开发板的ADC引脚配置方法,涵盖XADC模块基础、CLG400封装的引脚布局、硬件设计规范及Vivado工程配置实战。特别提供了完整的引脚列表和性能优化技巧,帮助开发者高效实现模拟信号采集,适用于Zynq-7000系列开发。

weixin_29188043的博客 466

Polars简明基础教程一:Polars快速入门

在这个例子中,我们将添加一个列,其中包含每个舱位中乘客的最大年龄。在Python中(而不是特指Polars),当我们将代码包裹在括号中时,我们可以在新行上调用一个新方法——在这种情况下是select。在这里,我们看到一个使用表达式API的简单示例,其中我们在select语句中选择Pclass、Name和Age列(我们将在第3节中深入了解select语句)。表达式是一个函数,它接受一个Series(或DataFrame中的列)作为输入,并返回一个Series(或DataFrame中的列)。

sosogod的博客 3879

【JavaScript】作用域、变量提升、函数提升

作用域是一个变量或函数的作用范围。作用域在函数定义时,就已经确定了。

Jerryqjr的博客 1532

边缘智能新篇章:RK3588上YOLOv8姿态估计的轻量化部署与性能优化实战

本文详细介绍了在RK3588平台上部署和优化YOLOv8姿态估计模型的完整流程。通过模型转换、ONNX中间表示和性能优化策略,实现在边缘设备上的高效实时推理,为嵌入式AI应用提供可行的轻量化解决方案。

ik6789012的博客 151

10分钟彻底搞懂JavaScript执行机制与作用域

JavaScript作为一门灵活的编程语言,其执行机制和变量声明规则有着诸多特性。理解这些特性对于编写高质量的JavaScript代码至关重要。本文将深入探讨JavaScript的执行机制、作用域、变量提升以及ES6引入的新特性,帮助开发者避免常见陷阱。JavaScript的执行机制和变量声明规则看似复杂,实则有迹可循。理解编译和执行的双阶段过程、作用域链的查找规则、变量提升的工作原理以及ES6引入的新特性,不仅能帮助我们写出更可靠的代码,也能在面试中脱颖而出。

2401_85392853的博客 1101

CGAL AlphaShape算法(自适应Alpha值,二维版本)

CGAL AlphaShape算法(自适应Alpha值,二维版本)

dayuhaitang1的博客 2324

【光斑定位】空间激光通信、光斑定位、CCD、光斑定位——13000字

0.完整源码获得方式 订阅MATLAB/FPGA教程,免费获得教程案例以及任意2份完整源码 ----------------------------------------------------------------- 空间激光通信是指以光波作为载波进行数据传输的一种通信方式。目前,空间激光通信己成为人们关注的焦点。在空间激光通信系统中,光斑定位是是一项关键技术。 本论文首先对国内外空间激光通信系统的研究现状进行了阐述,论述了空间激光通信的理论只是,并对CCD成像原理,...

FPGA/MATLAB学习教程/源码/项目合作开发 1290

JavaScript执行机制与作用域

JavaScript代码执行分为两个关键阶段:当JavaScript引擎拿到代码后,首先进入编译阶段: 1.2 执行阶段 编译完成后,代码按顺序执行,完成实际的赋值和函数调用操作。作用域决定了变量的可访问性和生命周期,JavaScript中包含三种主要作用域::在最外层定义的变量 :函数内部定义的变量 :ES6引入,在{}内使用let或const定义的变量当访问一个变量时,JavaScript会按照"冒泡查找"的规则:这种查找路径构成了:当前作用域 → 父作用域 → … → 全局作用域JavaScript采

2401_87882101的博客 860

《电磁兼容设计》专栏说明

本专栏自2024年1月起开始更新,仅设此一个电磁兼容相关知识专栏,并将一直持续更新下去,无期限

linkking27的博客 791

JavaScript 中 var、let、const 的变量提升与作用域机制

通过本文,我们回顾了JavaScript变量提升var声明的变量会在作用域顶部声明,而let和const声明的变量也会被提升,但受限于TDZ,确保在赋值前无法访问。作用域JavaScript中的作用域包括全局作用域、函数作用域、块级作用域和词法作用域,帮助控制变量的生命周期和可访问范围。理解这些规则有助于我们编写更高质量的代码,避免不必要的错误,使代码更加模块化、易维护。inne。

2401_86113453的博客 1319

2025美赛C题奥运奖牌榜模型(附代码+全保姆教程)Models for Olympic Medal Tables

伟大教练”效应的测量方法定义奖牌变化率:−−​如果变化率显著为正,且超出历史平均增长率,则认为存在“伟大教练”效应。使用统计方法(如t检验)验证教练到来是否带来显著性差异。

博客 6371

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

JavaScript 执行机制深度解析:从 V8 引擎到作用域链、变量提升与闭包的全面剖析

你是否曾遇到过以下“诡异”现象?函数在声明前就能调用?输出undefined而不是报错?循环中的setTimeout全部输出同一个值?在if块中用var声明变量,却影响了整个函数?这些看似“反直觉”的行为,其实都源于 JavaScript 引擎底层的执行机制。JS 是如何运行的?什么是执行上下文(Execution Context)?变量提升(Hoisting)是怎么回事?作用域(Scope)到底是什么?为什么letconst比var更安全?V8 引擎内部是如何处理这些概念的?

jj1245_的博客 583

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

JavaScript 作用域、变量提升

JavaScript 作用域JavaScript 作用域JavaScript 局部作用域JavaScript 全局变量JavaScript 变量生命周期函数参数HTML 中的全局变量ES6中的变量和作用域通过let和const决定块作用域const创建不可变的变量JavaScript 变量提升JavaScript 初始化不会提升在头部声明你的变量 你越是认真生活,你的生活就会越美好——弗兰克·劳埃德·莱特 《人生果实》经典语录 JavaScript 作用域 作用域是可访问变量的集合。 在 JavaScr

陈坚泓的博客 8582

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

JavaScript作用域、闭包、变量提升

了解作用域对程序执行的影响及作用域链的查找机制,使用闭包函数创建隔离作用域避免全局变量污染。作用域(scope)规定了变量能够被访问的“范围”,离开了这个“范围”变量便不能被访问,作用域分为全局作用域和局部作用域。局部作用域分为函数作用域和块作用域。在函数内部声明的变量只能在函数内部被访问,外部无法直接访问。 总结:在 JavaScript 中使用包裹的代码称为代码块,代码块内部声明的变量外部将有可能无法被访问。 JavaScript 中除了变量外还有常量,常量与变量本质的区别是常量必须要有值且不允许被重新

白女士的博客 876

JavaScript 引擎核心 理解执行上下文、作用域链与变量提升

执行上下文是 JavaScript 代码执行的环境,包含变量、函数声明、作用域链等信息。作用域链(Scope Chain)是 JavaScript 中用于解析变量访问的机制。每个执行上下文都有一个关联的作用域链,用于查找变量和函数。变量提升(Hoisting)是 JavaScript 引擎在代码执行前将变量和函数声明提升到作用域顶部的行为。闭包(Closure)是函数和其词法作用域的组合,使得函数可以记住并访问其定义时的作用域。

FEIU234的博客 1535

JavaScript 执行机制:变量提升和执行上下文详解

JavaScript 的变量提升和执行上下文机制是理解其运行原理的关键。通过了解这些概念,可以更好地编写和调试 JavaScript 代码。变量提升使得var声明的变量和函数在编译阶段被提升到作用域的顶部,而let和const声明的变量则不会被提升。执行上下文和调用栈管理着函数的调用顺序和变量的作用域。希望本文能帮助读者深入理解 JavaScript 的这些特性,提高编程水平。。

2401_87546826的博客 1086

JavaScript — 变量提升与函数提升、执行上下文、作用域

目录 一、变量提升与函数提升 1.变量声明提升 2.函数声明提升 3.问题:变量提升和函数提升是如何产生的? 二、执行上下文 1.代码分类 2.全局执行上下文 3.函数执行上下文 三、执行上下文栈 四、作用域 1.理解 2.分类 3.作用 五、作用域与执行上下文 1.区别1 2.区别2 3.联系 六、作用域链 1.理解 2.查找一个变量的查找规则 一、变量提升与函数提升 1.变量声明提升 通过var定义(声明)的变量,在定...

m0_59897687的博客 687

JavaScript基础--19-作用域和变量提升

- **概念**:通俗来讲,作用域是一个变量或函数的作用范围。作用域在**函数定义**时,就已经确定了。 - **目的**:为了提高程序的可靠性,同时减少命名冲突。 作用域的分类 在 JS 中,一共有两种作用域:(ES6 之前) - 全局作用域:作用于整个 script 标签内部,或者作用域一个独立的 JS 文件。 - 函数作用域(局部作用域):作用于函数内的代码环境。

weixin_48053866的博客 1151

深入拆解 JavaScript 作用域:从执行机制到 ES6 优化的完整知识体系

本文从V8引擎“编译-执行”双阶段切入,剖析JS执行机制与作用域的关联,详解ES5变量提升的历史成因与缺陷(变量覆盖、泄露),分类阐述全局、函数、块级三类作用域。重点解读ES6“变量环境+词法环境”双环境机制,结合实例说明块级作用域、暂时性死区的实现,最后给出`优先用let/const`等实践建议,助力开发者构建完整作用域知识体系,避开代码陷阱。

2302_80706750的博客 1319

JavaScript 变量提升 | 作用域 | 执行上下文 | 变量提升

文章目录变量提升执行上下文全局执行上下文函数执行上下文执行上下文栈 变量提升 JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。变量可以在使用后声明,也就是变量可以先使用再声明。 声明了a,没声明b,输出a不会报错,但是输出b会报错==>变量可以先使用再声明。 变量的提升只会把声明提升,但是初始化不会提升,也就是说可以输出a,但是a = 5却没有输出出来。 函数...

我是菜鸡 952

js执行机制,一、js变量提升和执行上下文栈

js变量提升和执行上下文、调用栈

李三岁的博客 884
上一篇: Gradle依赖管理太难?3步彻底解决版本冲突顽疾
下一篇: 【前端工程师成长金字塔】:揭秘TOP10公司都看重的8项能力
CodeIsle
博客等级 码龄1年 145粉丝 1966原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值