问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

① - var、let、const - JS变量声明和作用域

发布网友 发布时间:2024-10-02 19:23

我来回答

1个回答

热心网友 时间:2024-10-17 09:25

个人学习笔记,对基础知识的整理和巩固。#[1]

Javascript有三种声明方式[2]:

可通过这三种方式对变量进行声明,变量必须进行声明才可以使用(非声明变量的特例会再述),如:

变量的赋值

const必须在声明的同时赋值,并且不允许二次赋值。

var和let可以不在声明的时候赋值,也可以多次赋值。未赋值变量初始值为undefined。

const与let除此之外没有其他区别,故以下讨论只区分var和let,对const的理解可以直接带入let。

作用域

var作用域

var声明作用于全局或函数内,声明在函数内的作用于该函数内,声明于函数外的作用于全局。(可不妨理解为叫“函数内作用域”。)

块作用域

let和const均为块(大括号)作用域。变量仅在该代码块内生效,写在顶端的在全局生效。

变量名的共存问题

同一作用域(完全相同,包含关系等不算相同)内同一名称的变量只能存在一个,如果对同一名称进行了多次声明:

var的可重复声明特性使得,即使忘记了变量已经声明从而又一次声明,代码也可以正常运行,但在很多时候可能会造成变量重名等问题。

所以应该尽量避免重复声明。

不同作用域内同一名称的变量可以同时存在,变量的“指向”以“局部”为先,逐级上溯:

#[1]

变量声明的提升

代码执行前,变量声明会被提升,即不论声明写在哪一行,在该变量作用域内任何代码执行前即认为变量已声明。

事实上,MDN认为只有var声明会被提升[6],但是我觉得认为let和const声明也会被提升对于有些问题会非常好理解,并且不会影响到事实情况。如有不妥,还请指正。

其实变量的提升也可以理解为,该作用域内有没有声明变量。

暂存死区问题

这是一个能不能提前使用的问题,MDN把它叫做“暂存死区”。

即:let(const)声明的变量不能在声明位置前使用。

事实上,在"预处理"时,所有的声明被“注册”,var声明的变量会分配一个初始值(undefined),而let不会,只有执行到声明语句时,let声明的变量才会被初始化,而未初始化的变量不能使用。从let变量作用的块顶部到声明位置被称作“暂存死区”。

我们已经认为let声明也可以被提升,所以针对此处,let声明被提升,但是它声明的变量不能在声明位置之前使用。

而var可以:

来看下一个例子:

变量声明会被提升,所以,虽然在①处时,块内的声明尚在下一行,但是块内变量a实际上已经声明,又因为let声明的变量不能在声明位置前使用,所以抛出了错误。

而对于var:

另外还有两个相关的特殊例子:

let与for循环的特殊情况

for循环初始化语句中用let声明的变量会在流程中经过特殊处理,详情参见另一篇笔记: let与for循环 。

非声明变量(直接赋值变量)

如果不声明,直接为一个变量赋值,则会在全局对象(window)创建一个相应的属性,事实上,就可以认为它不是一个变量,而是全局对象的属性,仅此而已。它甚至可以通过delete删除:

即使在函数内,也会创建为全局属性。

这种方式创建的变量(全局对象的属性)不会被提升(因为它根本没有声明变量),只有在执行时才会产生。

顶层声明的var变量

在顶层声明的var变量也会成为全局对象的属性,但不能通过delete删除。

变量的连续赋值

const变量指向对象和数组

const变量(常量)不能重新赋值。但是如果常量指向对象或数组,其可被修改。

typeof运算符的特殊情况

使用未声明的变量会报错,但是typeof特殊:

主要内容的总结:

此篇仅为个人学习总结,大多为个人理解,专业性差,非教程,并不权威,也并不一定都正确。

如有错误,提前道歉,也欢迎指正。

如与其他有冲突,请以权威为准。

PS:

本来是写一个给自己看的类似笔记的东西,怎么写写写搞得跟教程似的。。。可能内心有一种想当老师的莫名的优越心态。。。这不好。。。我的技术也还着实很烂。。。。

另外也太浪费时间。。。。。。。。这啥时候能把这些过一遍。。。。还有很多东西要学。。。。

其实内容不多,但写的很多。。。。

自己忘了回头看也麻烦。。。。

还是得换种方式,更像笔记一点,更精炼一点。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
获取oracle中表的表结构、约束和索引信息 若3的x次方等于二十七分之一,则3的负x次方 若x的2x-1次方=1,则x=多少。若3的x次方=27分之1,则x=多少 3的x次方=1/81,x=? ...为什么?。。。若3的x次方等于81分之一,则x等于什么??急 语文句子成分分析详解 初三英语,关于被动语态 级品飞车lo如何下载? 极品飞车全球在线(nfsol)现在可以在大陆玩么?内测完毕了?听说要个登... ...一个星期不理我了怎么办,电话也不接信息也不回,问她是不是有男人了... javascript声明变量并赋值? 深入理解JS:var、let、const的异同 玉堂春幕后花絮 玉堂春故事梗概 剑三完全新手 一堆不懂的地方 小地图上是没有接任务的提示吗 是要安... 剑三里的一堆骷颅头是什么情况。在路上时不时就看到。大神求解 剑三世界地图上有两个地方没名字,看看是哪儿 剑三 这个小地图旁边的人是啥意思? Redmi Note 10T的IP68防水性能如何,是否优于Redmi Note 10 JE?_百度... 剑三地图上这个标志到底是什么 ...you mighthave been too late to get your ticket. ...you ?--__.I know it's not easy to get another one at the moment... ...have you? -- ___. I know it's not easy to get another one... 弱弱的问一句,女生爱花钱是天性吗? ...the concert ticket, have you?--___. I know it is not easy to... 弱弱的替我爸问一句啊,何以笙萧默结局是什么。最全的才有最佳哦! 个个都能打!盘点历届TGA最佳动作游戏 弱弱的问一句,滴滴是什么意思 今年TGA会上有哪些玩家从未见过的全新游戏? 如何评价游戏《艾迪芬奇的记忆》(whatremainsofedithf 中国是出口大国还是进口大国 哪些品牌的假发口碑比较好? 如图4-21是某地9月星空图。读图并回答下列问题。 银川有几所私立学校啊? 宁夏私立学校有哪些 我用同方急救中心备份系统盘,创建了多个还原点,现在备份区已满,_百度... 如何卸载同方急救中心找出隐藏盘 滴滴支持什么银行卡吗 英语作文:假如你是田君,你的英国笔友Emma想了解你最好朋友的情况。请... xy苹果助手里怎么不见了一个游戏叫刀塔挂机 科龙空调室内挂机感温头在哪里 为什么苹果手机没有刀塔392区 东西湖区走马岭中心小学师资力量 科龙空调FC故障怎样解决? 滴滴快车绑定的银行卡种类 东西湖区走马岭中心小学基础设施 刀塔来了ios苹果商店充值流程详细介绍 走马岭中学办学成果 苹果6app里刀塔传奇什么时候再上架 走马岭中学办学理念