[JavaScript]何为变量提升?

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://blog.csdn.net/m0_69908381/article/details/139742129
出自【进步*于辰的博客】

关于编译与解释,详述可查阅博文《[Java]知识点》中的【编译与解释】一栏。
参考笔记二,P43.3、P46.1、P9.3。

文章目录

  • 附言
  • 1、什么是“变量提升?
  • 2、var
  • 3、let
  • 4、解答
  • 5、一种特殊情况
  • 最后

附言

你在阅读本篇文章时,会看到一些名词,如:函数作用域,也就是由 var 声明的变量的作用域的名称,它是我根据我的理解自定义的。后来我了解到,JS中似乎并没有这个概念,对应的概念好像是“词法作用域”。

我暂未系统地学习JS,故无法详细地为你说明这个概念。当然,尽管我的用词可能不对,但就目前,这有助于我的学习理解。

如果你想进一步地学习这方面的知识,推荐一篇博文《JavaScript执行机制:变量提升、作用域链、词法作用域、块级作用域、闭包和this》(转发)。

1、什么是“变量提升?

“变量提升”是指在解释时,解释器先扫描整个JS脚本,将所有声明(包括变量和函数)移动到作用域顶端的机制,其本质就是声明与定义不同步的错觉。

var 与 let 具有相同的变量提升机制,故经变量提升后(“解释”后)的脚本相同。

PS:大家可能不明其意,往下看。

2、var

var 作用域的定义:

作用域的“上界”是变量声明处“往上”的第一个函数花括号({)。

故也称为“函数作用域”。允许重复声明和定义,且“变量提升”时,函数优先级高于变量。

示例:

console.log(str)
console.log(append)
// console.log(append(str))// 报错
var str = '中'
var append = function(str) {
    return str + '国'
}
console.log(str)
console.log(append(str))

经变量提升后:

var append;
var str;
console.log(str)-----------------------A
console.log(append)--------------------B
// console.log(append(str))------------C
str = '中'
append = function(str) {
    return str + '国'
}
console.log(str)// 打印:中
console.log(append(str))// 打印:中国

输出结果:
在这里插入图片描述

变量提升机制将strappend()的声明移动到作用域顶部,故 A 和 B 的打印结果都是undefined

由于变量提升时,函数的优先级高于变量,所以append()先于str声明。但毕竟只是声明而非定义,因此在执行 C 时,append只是一个未知变量,还不是函数,故报错。

3、let

let 作用域的定义:

作用域的“上界”是变量声明处“往上”的第一个花括号({).

故也称为“块级作用域”。不允许重复声明和定义(同一作用域)。且与 var 不同的是,let 声明的变量在定义之前,存在 “暂时性死区” \color{red}{“暂时性死区”} 暂时性死区,在定义前访问或赋值会报错。
(注:如let a是声明,let a = 1是定义。)

示例:(将上个示例稍作修改,var → let)

console.log(str)
console.log(append)
let str = '中'--------------------A
let append = function(str) {------B
    return str + '国'
}
console.log(str)
console.log(append(str))

输出结果:
在这里插入图片描述
在 A、B 之前,就是相应变量的“暂时性死区”,故报错。

4、解答

1:为什么函数也会进行变量提升?

因为函数也是一种变量。

  1. JS中有一种 内部对象 \color{green}{内部对象} 内部对象Function
  2. 从函数声明var xx = function()可以看出。

2:如何解释“let 不允许重复声明和定义”?

我们先来看由 var 修饰的情况,示例:

var a = 1
var a = 2

经变量提升后:

var a
a = 1
a = 2

也就是:变量提升会将重复声明进行覆盖

再来看 let 的情况。如果两个同名的变量都由 let 修饰,报错,这是 let 的特性。大家疑惑的多是这种情况:

var a = 1
let a = 2

先解答:也会报错。为什么?这涉及到一个细节:

var 的变量提升的优先级高于 let。

也就是说,经变量提升后:

var a
let a
a = 1
a = 2

这种情况 let 同样不允许,故报错。

稍作修改:

let a = 1
var a = 2

这种情况与上述完全相同,故也不允许。

5、一种特殊情况

在上文中,我们说到,这种情况不允许:

var a = 1
let a = 2

那么,请问下面这种情况能正常执行吗?

var a = 1
{----------------------A
	let a = 2
}

要解决这个问题,就要研究 var 与 let 的作用域了,大家还记得我在上文中所述的它们的作用域的定义吗?结论:

第一个a的作用域是“全局”,而第二个a的作用域是 A 处的代码块。

因此,两个a的作用域不同,故不报错。

再给大家抛出一个问题:这样会报错吗?

let a = 1
{
	var a = 2
}

PS:相信大家看到这里,已经对 var 和 let 有了足够的掌握,这个问题就交由大家思考了。

最后,为大家补充两个结论:

  1. var 是ES5的语法,let 是ES6的语法。
  2. 定义变量时可以不用 var 或 let 修饰(即直接a = 1),那么 var 与 let 的作用是什么?var 与 let 定义 / 决定了变量的作用域。因此,定义变量时如果不用 var 或 let 修饰,就不存在“变量提升”,则在定义前访问或赋值将直接报错。

最后

其实,在日常工作中,区分var与lei的实际作用并不大,我们更关注的是业务的梳理。因此,本篇文章旨在巩固JS基础。

本文完结。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/718039.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python基于PyQt5和决策树分类模型实现学生就业预测系统GUI界面项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PyQt5是一个广泛使用的Python绑定库,用于Qt框架,使开发者能够使用Python开发跨…

c++qt合并两张灰度图像

需求:将两张尺寸相同的灰度图像进行合并,合并后的图像,每个像素点灰度值为两张原图对应像素点灰度值之和。若超过255,则最大为255。 方法一: 将图像读取为cv::Mat,再调用opencv的cv::add方法,进…

苍穹外卖笔记-18-修改密码、bug记录

文章目录 1 修改密码1.1 需求分析和设计1.2 代码实现1.2.1 admin/EmployeeController1.2.2 EmployeeService1.2.3 EmployeeServiceImpl 1.3 功能测试 2 bug记录 1 修改密码 完结的时候发现还有一个接口未实现。这里补充 1.1 需求分析和设计 产品原型: 业务规则&am…

TF-IDF(Term Frequency-Inverse Document Frequency)

TF-IDF(Term Frequency-Inverse Document Frequency)是一种常用于信息检索和文本挖掘的统计方法,用以评估一个词语对于一个文件集或一个语料库中的其中一份文件的重要程度。它的重要性随着词语在文本中出现的次数成正比增加,但同时…

24执业药师报名时间汇总及报名流程!

24执业药师报名时间汇总!报名流程! 🕛️各省市报名时间汇总(共9地) 西藏:6月29日-7月8日 新疆:6月25日10:30-7月9日19:00 内蒙古:6月20日9:00-7月3日24:00 新疆兵团:6月2…

Mysql中索引详解

1、什么是索引 在日常学习中,最常见使用索引的例子就是词典,通过对字母进行排序,并设置对应的页数,从而循序定位某个单词,除了词典,如火车站的车次表、图书的目录等都是使用了索引。它们的原理都是一样的&…

研发管理平台有哪些?符合软件公司需求的工具要具备这几个特征!

本人从事TOB行业十余年,目前就职的就是一家软件公司。下面,本人就站在软件公司的角度来讲一讲:我们公司做项目研发时,会选择一个什么样的研发管理工具来辅助?供大家参考。 众所周知,软件研发项目是一个复杂…

python基础 002 - 1 基础语法

1 标识符(identifier),识别码,表明身份 身份证,ID 定义:在编程语言中标识符就是程序员自己规定的具有特定含义的词,比如类名称、属性名称、变量名等, 在Python 中,pyt…

压缩列表(ziplist)

压缩列表(ziplist): ziplist是列表键和哈希键的底层实现之一 当一个列表键只包含少量列表项,并且每个列表项要么是小整数或者短字符串,那么redis会使用ziplist来做列表键的实现当一个哈希键只包含少量键值对&#xff0…

HarmonyOS NEXT首个公测Beta版封包完成

华为将在6月21日至23日在深圳举办华为开发者大会2024。 根据华为消费者业务CEO余承东此前的预告,HarmonyOS NEXT将在大会上正式推出Beta版本,用户将有机会体验全新的鸿蒙系统。 HarmonyOS NEXT首个公测Beta版封包完成:Mate 60和Pura 70系列即…

苹果电脑病毒怎么处理 苹果电脑病毒查杀用什么软件 苹果电脑病毒软件

苹果电脑并不是完全免疫于病毒的威胁,尤其是在使用了一些不安全的软件或网站后,可能会感染一些恶意程序,导致电脑运行缓慢,数据丢失,甚至被黑客控制。那么,苹果电脑病毒怎么处理呢?苹果电脑病毒…

2024北京智源大会

北京智源大会是年度国际性人工智能高端学术交流的盛会,定位于内行的AI盛会。智源大会紧密围绕当前人工智能学术领域迫切需要解决的问题,以及产业落地过程中存在的诸多挑战,开展深入探讨。智源研究院是2018年11月份成立的一家人工智能领域的新…

社团管理系统

用Spring Boot、Vue.js和MyBatis实现社团管理系统 温馨提示:项目源代码获取方式见文末 摘要 本文探讨了如何使用Spring Boot作为后端框架,Vue.js作为前端框架,以及MyBatis作为数据库持久层框架,构建一个社团管理系统。该系统旨…

OpenGL3.3_C++_Windows(11)

git submodule项目子模块 Git Submodule (子模块的代码并不直接存储在父仓库中,而是通过一个指针来维护)克隆含有子模块的仓库时,使用git管理Git Clone (复制一份完整的Git仓库到本地)若仓库包含子模块&am…

【Springboot系列】总结websocket的几种实现方式,建议收藏

1、前言 websocket在java中有多种实现方式,一直没有做一个整理,今天整理下三种最常用的实现方式以及一些注意点 2、javax 实现方式 之前已经单独记录了这种方式 【SpringBoot系列】springboot websocket全套模板,省去搭建的烦恼&#xff…

安卓TextView控件实现下划线

效果展示 这里需要使用到LayerDrawable&#xff0c;对应于<layer-list>标签。在drawable目录下新建一个text_underline.xml文件&#xff0c;text_underline.xml的代码如下&#xff1a; <?xml version"1.0" encoding"utf-8"?> <layer-lis…

算法安全自评估报告如何填写?(附模板)

之前&#xff0c;众森企服给大家讲过办理互联网信息服务算法备案有三部分组成&#xff1a;主体备案、算法备案和产品备案。 主体备案主要审查的就是一家主体公司是否有算法相应的规章制度&#xff0c;里面最主要的就是算法安全管理制度。 算法备案主要审查的就是算法本身的情…

便携式手持气象仪:低功耗设计

TH-LSZ05便携式手持气象仪是一款轻便、操作简便的气象监测工具&#xff0c;集成了风向、风速、大气压、温度、湿度五项气象要素的测量功能。这些设备通常设计为体积小、重量轻&#xff0c;以便于用户随时携带并使用。通过使用手持气象仪&#xff0c;用户可以实时获取关键的气象…

清华停招土木,新增地球科学引热议

早在今年2月26日&#xff0c;多个自媒体平台上有人发布消息称“清华大学停止土木工程等专业招生”&#xff0c;引发广泛关注。 在清华大学的官网可以看到下图的公告。 可以看到&#xff0c;清华大学停招土木工程等专业&#xff0c;新增地球系统科学等专业。这一举措引起全网热…

LaTeX 的使用

文章目录 TeX 编辑器文档类型中文编译文档结构preamble 导言区&#xff08;不能放正文内容&#xff09;document body 正文区 正文内容目录段落列表无序列表有序列表 图片表格交叉引用段落图片表格 转义符 数学公式数学符号行内公式行间公式有公式计数器无公式计数器 公式包含文…