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

【JS】声明提升与块级作用域

我是目录

  • 引言
  • 声明提升
      • 声明提升的理解
      • 函数表达式
      • 声明提升总结
  • 代码生成与查找变量的过程
    • 代码生成
      • 词法分析( Tokenizing/Lexing)
      • 语法分析( Parsing)
      • 代码生成
      • 生成代码总结
    • 查找变量
  • 不同版本中的执行上下文
    • 不同版本对执行上下文的定义
  • let/const
    • let特点
    • const特点
    • let/const声明的变量,是否还会变量提升?
    • let/const是如何实现块级作用域的?

引言

上一篇作用域、执行上下文与闭包中,主要介绍的是概念,其中涉及很多细节和考点并没有详述。这一篇查缺补漏,讲一些有时候会考的东西(大概碰到过一两次?)。

声明提升

引擎会在解释 JavaScript 代码之前首先对其进行编译。 编译阶段中的一部分工作就是找到所有的声明, 并用合适的作用域将它们关联起来。包括变量和函数在内的所有声明都会在任何代码被执行前首先被处理。这个过程就好像变量和函数声明从它们在代码中出现的位置被“移动”到了最上面。 这个过程就叫作提升。
每个作用域都会进行提升操作,函数声明和变量声明都会被提升。

foo();
bar();
var foo = function bar() {// ...};

上段代码将被看成,所以会报错:

var foo;
foo(); // TypeError
bar(); // ReferenceError
foo = function() {var bar = ...self...// ...
}

但是一个值得注意的细节是函数会首先被提升, 然后才是变量。后面的函数声明还是可以覆盖前面的函数声明。

foo(); // 1
var foo;
function foo() {console.log( 1 );
} 
foo = function() {console.log( 2 );
};

会输出 1 而不是 2 ! 这个代码片段会被引擎理解为如下形式:

function foo() {console.log( 1 );
} 
foo(); // 1
foo = function() {console
http://www.lryc.cn/news/478007.html

相关文章:

  • Flink的流、批处理
  • 学习方法该升级了,‌AI时代的弯道超车:【心流学习法】行动与意识合一的巅峰进化
  • 【大模型LLM面试合集】大语言模型架构_chatglm系列模型
  • 深入理解 Kafka:分布式消息队列的强大力量
  • LabVIEW 离心泵机组故障诊断系统
  • GEE土地分类——土地分类的原始remap转化原始的土地分类名称
  • 一些关于云电脑与虚拟化东西
  • Java实现图片转pdf
  • 【iOS】使用AFNetworking进行网络请求
  • ThingsBoard规则链节点:RPC Call Reply节点详解
  • 【AI换装整合包及教程】OOTDiffusion:以AI技术引领的时尚换装革命
  • 排序算法详细总结
  • uniapp MD5加密
  • 提升视觉回归测试体验:Cypress 插件推荐
  • fastbootd模式刷android固件的方法
  • 基于C#实现Windows后台窗口操作与图像处理技术分析
  • 戴尔电脑 Bios 如何进入?Dell Bios 进入 Bios 快捷键是什么?
  • 数据结构之二叉树——堆 详解(含代码实现)
  • 推荐一款面向增材制造的高效设计平台:nTopology
  • SQL,力扣题目1767,寻找没有被执行的任务对【递归】
  • JavaScript数据类型- Symbol 详解
  • WordPress网站添加嵌入B站视频,自适应屏幕大小,取消自动播放
  • 11.6 校内模拟赛总结
  • Redis常用的五大数据类型(列表List,集合set)
  • Ubuntu 20.04 部署向量数据库 Milvus + Attu
  • 实现数传数据转网口(以太网)和遥控器SBUS信号转串口的功能
  • APP 后台广告位配置的关键要素与策略
  • 分布式数据库概述
  • 用通义灵码帮助实现校验bpmn.js当前画布上只能有一个开始节点的功能
  • OKHTTP断点续传