详解var、let、const关键词声明变量的区别,以及变量提升、块级作用域的认识等。
首先回顾一下JavaScript中var声明变量的基础知识:
• 在使用var关键词声明变量时,变量在函数外则是全局变量,有全局作用域,全局变量在页面关闭后销毁;变量在函数内则是局部变量,作用局部作用域(变量只能在该函数内有效,函数执行完将自动销毁)
• 我们使用var来创建变量,声明后未赋值的变量输出会提示 “undefined”。在方法函数外声明的变量未使用var ,会报错“x is not defined”;
• 在函数内未使用var声明的变量自动变为全局变量
开发背景(WHY)为什么要使用let、const关键词来创建变量或常量
•解决ES5使用var初始化变量时会出现的变量提升问题
•解决使用闭包时出错的问题
•解决使用计数的for循环变量时候会导致泄露为全局变量的问题,
•ES5只有全局作用域和函数作用域(对应var声明的全局变量和局部变量时),没有块级作用域(ES6中{}中的代码块)。同理只能在顶层作用域window中和函数中声明函数,不能在块级作用域中声明函数;
那么先来理解一下什么是变量提升特性,会导致的问题(比如内层变量覆盖外层变量)
•变量初始化时可以分为两步:使用关键词var声明变量,以及赋值。变量提升就是将声明变量这一步提升到该作用域的头部。注意函数声明也会类似var声明出现提升特效,函数声明提升在变量声明提升上面;
参考网址:https://blog.csdn.net/recoluan/article/details/79253223
实例01
实例02
注意:在使用let、const命令声明的变量不具备变量提升效果;
:函数声明提升会在变量声明提升上面
为什么需要块级作用域?
• 用来计数的循环变量泄露为全局变量,如下:
• let和const是ES6新增特性,都可生成块级作用域(是指声明在花括号内的变量只在该区域内有效)。let用来声明变量,const用来声明常量(不可修改变量值,数组和对象除外);如果区块内存在let或const命令,这个区块对这些命令声明的变量会形成封闭的区域,该区域外不能被使用,且变量声明前使用变量会报错(又叫暂时性死区),更加严谨
块级作用域外不能访问该区块内的变量或者常量,子块级作用域可以访问父块级作用域的变量
以上代码中通过将let替换var就可以修复各种bug,所以,“let
是更完美的var
”。
其他的let、const和var的用法及注意点
• let和var的区别:let声明的变量只在其声明的块或子块中可用,而var声明的变量的作用域是整个封闭函数可用;
• let和const的特点:
① let和const关键词声明的变量不具备变量提升的特效(第二步提到了的),存在暂时性的死区,只能在声明的位置后使用,同一块级作用域中不能反复声明同一变量名(子块级可以重复声明父块级变量),var可以;
② let和const声明只在最靠近的一个块(花括号内)中有效;
③ 使用const声明常量时候大写,const在声明时必须赋值;
注意1: const声明的变量值并不是不能变的,而是变量指向的内存地址是不能变的,对于数值、字符串等简单类型的数据,值就保存在变量指向的内存地址上,因此等同于常量;但对于符合类型的数据(如数组和对象),变量指向的内存地址是一个指引,数据结构是否可变就不能控制了,所以将对象声明为常量必须非常小心;
注意2:外层块作用域不可以访问块内层作用域,内层块作用域可以获取外层块作用域变量,子块可以重复定义外层块作用域变量。函数在块级作用域中声明是行为类似let,不能被作用域外访问,块中的函数声明存在变量提升,确实需要时候使用函数表达式的形式,而不是函数声明语句形式;
注意3: Let不允许在相同作用域中使用与其他let或const,重复声明同一个变量,所以不能在有参函数声明中重复声明函数参数,如function func(arg){let arg}会报错
注意4: 在ES5中顶层对象(在浏览器指的是window对象),顶层对象属性和全局变量是等价的。属性也可以动态创建变量,顶层对象的属性可以被随处读写不利于模块化编程;而在ES6中,var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。也就是说,从 ES6 开始,全局变量将逐步与顶层对象的属性脱钩。
详解var、let、const关键词声明变量的区别,以及变量提升、块级作用域的认识等。相关推荐
- 浅谈js中的var和function变量提升,var声明变量提升,块级作用域中的函数提升
1.首先最常见的一种变量提升 console.log(a); //输出 undefinedvar a=10;console.log(a) // 输出 10 var 有提升的作用其实上面的代码会变成会变 ...
- Java中static的作用详解_详解java中static关键词的作用
在java中,static是一个修饰符,用于修饰类的成员方法.类的成员变量,另外可以编写static代码块来优化程序性能:被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载 ...
- java中static修饰函数_详解java中static关键词的作用
在java中,static是一个修饰符,用于修饰类的成员方法.类的成员变量,另外可以编写static代码块来优化程序性能:被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载 ...
- var/let/const、块级作用域、TDZ、变量提升
概览 ES6 新增了两个定义变量的关键字:let 与 const,它们几乎取代了 ES5 定义变量的方式:var.let是新的var,const简单的常量声明. function f() {{let ...
- ES6(一)——字面量的增强、解构、let/const、块级作用域、暂时性死区
一.字面量的增强 ES6中对 对象字面量 进行了增强,称之为 Enhanced object literals(增强对象字面量). 字面量的增强主要包括下面几部分: 属性的简写:Property Sh ...
- let、const和var的区别(涉及块级作用域)
let .const和var的区别 let.const.var在js中都是用于声明变量的,在没有进行ES6的学习前,我基本只会使用到var关键字进行变量的声明,但在了解了ES6之后就涉及到了块级作用域 ...
- ES6 块级作用域详解
什么是块级作用域 ES6 中新增了块级作用域.块作用域由 { } 包括,if 语句和 for 语句里面的 { } 也属于块作用域. 为什么需要块级作用域 第一种场景:内部变量会覆盖外部变量 var t ...
- c语言比特和字节,详解 比特(位,bit),字节(Byte),字符的区别 *(转)
比特(位):英文bit,是计算机晶体管的一种状态(通电与断电).就是0与1,真与假,是计算机最基本的传输单位. 示例: 2bit : 10; 4bit : 1111; 8bit : 1111 1111 ...
- java comparator相等_详解Java中Comparable和Comparator接口的区别
详解Java中Comparable和Comparator接口的区别 发布于 2020-7-20| 复制链接 摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一 ...
最新文章
- c语言中delay找不到标识符,51单片机的c语言,请问哪里错了?延时没有效果,但是编译又不报错。delay应该怎么写,怎么引用啊?...
- smc数显压力表设定方法_SMC压力表使用注意与调试方法
- tiny core linux 编译,tinycore linux使用
- Java中的全局变量和局部变量——简单区别
- 通过在操作系统中实际操作,学习和理解 Unicode 编码相关知识
- 数据库作业[定时执行任务]的创建
- 清华王兴再抛神论:为什么教育决定着中国餐饮业质量?
- 给一线讲产品·7期|用户在云上如何快速搭建安全防护体系?
- ubuntu 更改文件夹拥有者和权限
- ewebeditor 路径
- 图(graph)神经网络学习(四)--代码解析(Model_2)
- Could not create ServerSocket on address 0.0.0.0/0.0.0.0:9083
- 计算机室火灾隐患表现,大学消防知识安全宣传图片系列六:计算机室、微机房的火灾隐患和消防须知...
- 微信小程序图标点击后变色并跳转页面
- 盘点2017年最热门的10个增长黑客策略
- python判断是否闰年_【python】判断年份是否为闰年
- Xcode Accounts连接到Apple ID 服务器时出错
- 安卓游戏开发一(超级玛丽)
- 计算机网络应用最简单的,计算机网络的基础知识和简单应用.ppt
- Spring Boot入门系列(十八)整合mybatis,使用注解的方式实现增删改查
热门文章
- pycharm运行模型时怎么设置权重?_使用AMP和Tensor Cores得到更快速,更节省内存的PyTorch模型...
- 华为手机的分类有何区别_“鸿蒙”系统能不能玩安卓游戏?如果能,它跟安卓系统有何区别?...
- 罗马音平假名片假名转换器_关于五十音你所要知道的一切!文末附日网高清字帖...
- java协变返回类型_Java中的协变返回类型
- c语言 函数的参数传递示例_llround()函数以及C ++中的示例
- 「递归算法」看这一篇就够了|多图
- 万字详解Lambda、Stream和日期
- 五、华为鸿蒙HarmonyOS应用开发之Java开发模式下的同一个 Page 里实现页面跳转时无参(有参)传递、回值详解
- Linux(CentOS 7)安装docker
- Vue + SpringBoot跨域