tnblog
首页
视频
资源
登录

新的变量的声明方式 let

6202人阅读 2020/6/24 16:41 总访问:123041 评论:0 收藏:0 手机
分类: ES6

ES6 之前的变量声明方式:

在 ES5 中写 var 和 不写 var 区别是什么?

  • 使用 var 是在当前的作用域内声明一个变量
  • 在函数中声明就是函数中的作用域变量
  • 在全局声明就是全局作用域变量
  • 不写 var 就是在 window 这个这个全局对象上定义一个属性

如何证明 不写 var 就是在全局对象 window 上增加了一个属性呢??

通过 函数 delete 方法
delete 的作用就是用于删除对象上的属性 => 注意也只能用于删除对象上的属性 并不能够删除变量

  1. var a = 5
  2. console.log(a) => 5
  3. delete a
  4. console.log(a) => 5
  5. console.log(window.a) => 5
  1. b = 6
  2. console.log(b) => 6
  3. delete b
  4. console.log(b) // 当前的b已经被删除掉了 报错
  5. console.log(window.b) // undefined

总结 写 【var 就是一个变量 不写 var 就是浏览器顶层对象 window 上的一个属性】
方法 delete 可以删除对象上的属性

window.a 和 window.b 都能够输出内容是因为 js 早期的作者将 Window 顶层对象和 全局变量做了挂钩 (现在多数人都以为这是js var 变量设计的败笔)=> 所以我们使用 let 声明变量就可以很好的解决这个问题

【不推荐在开发项目的时候将 变量挂载在全局对象 window 上 这样会污染全局对象 window】

  1. let aa = 5
  2. console.log(aa) // 5
  3. console.log(window.aa) // undefined

let 声明变量的优点:

  • 不属于顶层对象 window
  • 不允许重复声明 重复声明会报错
  • 不存在变量提升
  • 暂时性死区
  • 块级作用域

优点解释:

· 暂时性死区

【暂时性死区 => 防止变量在声明之前使用变量】

  1. var aaa = 5
  2. if (true) {
  3. aaa = 6
  4. let aaa // Cannot access 'aaa' before initialization
  5. }

【这种就会报错 因为在使用的时候还没有声明 这个也是暂时性死区】

  1. function foo(a = b, b = 2) {
  2. console.log(a, b)
  3. }
  4. foo()

【这里也会报错 因为在调用函数的时候 b 未初始化 暂时性死区】

  1. function foo(a = b, b = 2) {
  2. console.log(a, b)
  3. }
  4. foo()

【这个先声明在使用的就没有问题】

  1. function foo(a = 2, b = a) {
  2. console.log(a, b)
  3. }

· 块级作用域

块级作用域: 【在 es5 变量的声明中只有全局作用域和函数作用域 并没有全局作用域的概念 {} 内就是块级作用域】
{} 中定义的变量只能在 {} 中使用出了这个范围就不能使用了

看看 ES5 中没有块级作用域引发的后果

  1. for (var i = 0, i < 3; i++) {
  2. console.log('循环内:' + i)
  3. }
  4. console.log('循环外' + i) // 最终的结果 i = 3
  1. if (false) {
  2. var a = 10
  3. }
  4. console.log(a) // undefined

ES6 中存在块级作用域

  1. for (let i = 0, i < 3; i++) {
  2. console.log('循环内:' + i)
  3. }
  4. console.log('循环外' + i) // 最终的结果 undefined
  1. if (false) {
  2. var a = 10
  3. }
  4. console.log(a) // 报错

【 ES6 中 块级作用域必须存在 {} 否则 js 引擎就会认为不存在块级作用域 => 报错】

细微差别:

  1. if (true) var a = 10 // => var 声明变量是可以的 => var 会有变量的提升
  2. if (true) let a = 10 // => let 声明变量就会报错 => js 引擎认为不存在块级作用域 => 无法声明变量 => 报错

牛刀小试:

  1. // 考验题
  2. for(var i = 0; i < 3; i++) {
  3. setTimeout(() => {
  4. console.log(i) // 3 3 3
  5. }, 1000)
  6. }

这里输出的结果是 3个3

解释:
在 js 中 setTimeout 定时器是一个异步函数 异步函数的执行会等待同步函数的执行完成 当 for 循环执行完成的时候 才开始异步的 函数执行 所以 会输出 3 个 3

提出挑战 如何才能按照 0 1 2 的方式输出 结果值呢??

方式1: 通过 闭包的方式

  1. for(var i = 0; i < 3; i++) {
  2. (function(j) {
  3. setTImeout(function() {
  4. console.log(j)
  5. })
  6. })(i)
  7. }

方式2: 在原来代码的基础上直接使用 let 声明 变量 i 即可

在 编译代码的时候自动将代码编译成 闭包的方式 锁住 变量 i

评价

code first执行命令报错,无法将“Enable-Migrations”项识别为 cmdlet、函数、脚本文件

EF:执行命令报错无法将“Enable-Migrations”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如...

net core webapi delete请求 错误 - 405.0 - Method Not Allowed

是因为被WebDAVModule模块限制了delete,put请求解决方法一:在iis中去干掉这个模块这样会全局影响所有网站解决方法二:单独...

WebAPI调用Delete传值

结合之前post,put方式,综上所述。首先路由传id。在方法里面定义参数在前台使用ajax传值调试进去则成功了不使用路由直接传...

.netcore3.1 RabbitMq OverflowDead letter ExchangeDead letter RoutingMax priority

.netcore3.1 RabbitMq Overflow,Dead Letter Exchange,Dead Letter Routing,Max priority[TOC] Overflow 从字面意思来讲...

.net core webapi无法请求delete接口

是因为WebDAV模块造成的,你可以在windows添加和删除功能把iis里边的WebDAV模块全局删除,也可以独立的配置某个项目不需要...

无法将“node.exe”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次

前言:大家好我是小付,还记得上一次写了一篇虚拟机的安装教程吗?就是因为那个玩意 把我坑了好久,刚开始不晓得咋玩 就在...

layui table使用templet,解析状态字段逻辑处理等

比如有这样一个表格:我们想把其中的状态变成具体的文本描述,就可以使用layui table的templet方法1:直接给一个函数即可。...

servlet 快速部署入门(继承GenericServlet类)1

一、介绍二、入门搭建1:。。。。。2、3:第2 步还可以通过实现servlet接口完成,但是通过接口完成的话,需要重新的方法就...

servlet 的 实现(继承HttpServlet抽象类)3

一、通过第三种方式继承HttpServlet抽象类1、2:3:在web.xml中配置4、部署。。。。。。5、测试a、前端b、后端

servlet 生命周期 4

1、创建JavaWeb 项目...........2、继承HttpServlet抽象类重写诸多方法方法类容3、在web.xml的配置4、部署到tomcat。。。。...

servlet 线程安全问题 5

线程安全问题一、创建Javaweb项目。。。。。二、创建类1、继承抽象类,重写方法2、doGet的具体逻辑三、在web.xml的配置四、...

servlet 映射的方式 6

一、创建Javaweb项目,继承HttpServlet抽象类二、在web.xml的配置1、第一种前端的访问2、第二种前端的访问3、第三种前端的...

servlet 多映射的使用场景 7

一、创建Javaweb项目,继承HttpServlet抽象类二、在web.xml的配置三、部署到tomcat。。。。。。四、启动。。。。。。五、访...

servlet 创建时机 8

一、创建Javaweb项目。。。。。。继承HttpServlet抽象类重写诸多方法方法类容三、在web.xml的配置四、部署到tomcat。。。。...

默认 servlet 9

要点就是你平时报的404之类的页面,它其实就是tomcat提供的servlet
大概你身上总有我喜欢的味道,所以我一见你就开心的笑
排名
30
文章
18
粉丝
6
评论
11
vs code 插件安装推荐
修心 : 背景的妹子好评啊!
如何完全干净的卸载 vs code编辑器
剑轩 : vs code插件这么顽强的么
广告终结插件推荐
剑轩 : 我好像也是用的这个
windoes 强力下载工具Internet Download Manager
饰心 : 线程不要开多了 开多了要遭网站拉黑
推荐一款三无压缩软件:bandizip
瑾语 : 用过 感觉没rar好用
修改电脑的鼠标指针样式
剑轩 : 挺喜欢你这个个性签名的
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术
爱情不是一个拼图,是一个圆碰到另一个圆。