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

【JavaScript寻宝之旅】var和let的区别

前言

在JavaScript中,letvar 都是用来声明变量的关键字

let 和 var 的区别 

作用域:

  1. var 声明的变量具有函数作用域(function scope)。如果在一个函数内部声明,它只在该函数内部可见。如果在一个函数外部声明,它会成为全局变量。
  2. let 声明的变量具有块级作用域block scope)。这意味着 let 变量只在声明它的代码块(如 if 语句、for 循环等)中可见。

提升:

  1. var 声明的变量会经历变量提升(hoisting),这意味着变量可以在声明之前使用,但会初始化为 undefined
  2. le 声明的变量也会被升,但是不会被初始化,所以在声明之前访问它会导致 ReferenceError

重复声明:

  1. 使用 var 可以在同一个作用域内多次声明同一个变量,后面的声明会覆盖前面的值。
  2. 使用 let 在同一个作用域内不能重复声明同一个变量,尝试这样做会导致语法错误。

全局对象属性:

  1. 当使用 var 在全局作用域下声明变量时,它会成为一个全局对象的属性(在浏览器中是 window 对象)。
  2. 使用 let 在全局作用域下声明变量时,它不会成为全局对象的属性。

暂时性死区:

  1. let 声明的变量存在暂时性死区(Temporal Dead Zone, TDZ),即在声明之前到声明的位置之间,变量是不可见的。
  2. var 没有暂时性死区,变量在声明之前就可访问,只是值 undefined

 

// 全局作用域
var a //在全局作用域声明一个a变量
a = 5//变量赋值 
c //变量声明必须加上关键词let var const(常量),没有就报错
d = 6//变量赋值会先查找(查找到window)如果没有,就声明(相当于使用var,但是不会预解析)再赋值
function fn() {var b=6//私有作用域声明一个变量console.log(a)//变量使用,在自己作用域查找,没有去上一级查找(作用域链),找到了a为5返回5
}
fn()
console.log(b)//错误全局中没有b变量,b变量是定义在function里面的,是fn私有的,全局调用报错

块级作用域和局部作用域区别
                块级作用域:只要{}没有和函数结合在一起, 那么应该"块级作用域"

                局部作用域:函数后面{}中的的作用域, 我们称之为"局部作用域"

                1、在块级作用域中通过var定义的变量是全局变量

                2、在局部作用域中通过var定义的变量是局部变量

                3、let只要在{}里面就是局部变量

                4、无论是在块级作用域还是在局部作用域, 省略变量前面的let或者var就会变成一个全局变量(省略之后,赋值号必须要,不然报错表示直接使用not defined,省略之后不会进行预解析,相当于给window增加了一个属性名和属性值)

//块级作用域{}
{var a = 1; // 全局变量let b = 2; // 局部变量c = 3; // 全局变量
}//函数后的{} 局部作用域
function test() {console.log(d)//undefinedvar d = 4; // 局部变量let e = 5; // 局部变量console.log(f)//报错(Uncaught ReferenceError: f is not defined)f = 6; // 全局变量 不会预解析console.log(f)//6 赋值了
}
console.log(a)//打印1
console.log(b)//报错
console.log(c)//打印3
test()//执行函数test,里面的变量才会预解析,将de解析为局部变量,f为全局变量,(变量污染,里面的变量会污染全局),不执行f变量会出错
console.log(d)//报错
console.log(e)//报错
console.log(f)//打印6

 

相关文章:

  • 图书管理系统(Java版本)
  • 如何进行前端职业规划
  • 小红书-社区搜索部 (NLP、CV算法实习生) 一面面经
  • 宝藏网站推荐-封面图片生成器
  • 芯课堂 | UI Creator 物理键盘移植指南
  • element ui 的密码输入框点击显示隐藏密码时,图标随之改变
  • Mysql之基本架构
  • 信息系统项目管理师--八大绩效域-不确定性绩效域
  • 1701java药品进销存管理系统Myeclipse开发sqlserver数据库web结构java编程计算机网页项目
  • Docker简单使用
  • React中显示数据
  • 大数据学习之安装并配置maven环境
  • 领域知识 | 智能驾驶安全领域部分常见概论
  • 深入分析 Android Activity (三)
  • 如何用正则表达式匹配中文和英文
  • [译]如何构建服务器端web组件,为何要构建?
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • docker-consul
  • egg(89)--egg之redis的发布和订阅
  • ES6--对象的扩展
  • JS笔记四:作用域、变量(函数)提升
  • Python - 闭包Closure
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • react-native 安卓真机环境搭建
  • vagrant 添加本地 box 安装 laravel homestead
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 和 || 运算
  • 基于Android乐音识别(2)
  • 微服务框架lagom
  • 正则表达式
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • # C++之functional库用法整理
  • # windows 安装 mysql 显示 no packages found 解决方法
  • #Linux(权限管理)
  • (1)(1.9) MSP (version 4.2)
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (分类)KNN算法- 参数调优
  • (七)Activiti-modeler中文支持
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (十六)一篇文章学会Java的常用API
  • (五)activiti-modeler 编辑器初步优化
  • (五)MySQL的备份及恢复
  • (已解决)什么是vue导航守卫
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • ***利用Ms05002溢出找“肉鸡
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .net framework profiles /.net framework 配置
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET轻量级ORM组件Dapper葵花宝典
  • .Net转Java自学之路—SpringMVC框架篇六(异常处理)
  • :class的用法及应用
  • @ModelAttribute 注解
  • []FET-430SIM508 研究日志 11.3.31