ES6块级作用域let声明和const声明以及与var之间的区别
一、ES6块级作用域
let 声明
块级声明用于声明在指定作用域之外无法访问的变量,存在于:
①函数内部
②块内(字符{和}之间的区域)
禁止重声明
(1)如果在作用域由已经存在某个标识,再用let声明时会报错
var name = 'zhang'
let name = 'wang' // 报错
(2)如果在当前作用域内嵌另一个作用域,使可在内嵌的作用域中用let声明同名变量,代码如下:
var name = 'zhang'
if(status){
let name = 'wang' // 不会报错
}
const 声明
声明的是常量,一旦被设定后不可更改,所以,每个通过const声明的常量必须进行初始化。
正确:const name = 'zhang';
错误:const name;
const 与 let
相同之处:都是块级标识符,只在当前代码块内有效,不会提升至作用域顶部。
不同之处:无论在严格模式下还是非严格模式下,都不可以为const 定义的常量再赋值,否则会报错。
用const 声明对象
const 声明不允许修改绑定,但允许修改值,也就是说,用const声明对象后,可以修改该对象的属性值,代码如下:
const person = { name : 'zhang' };
// 可以修改对象属性的值 person.name = 'wang'
// 报错 person = { name:'wang' }
临时死区
let和const与var不同,声明的变量不会被提升到作用域的顶部,不可在声明之前访问这些变量。
if(status){
console.log(typeof value);
let value = "blue";
}
// 此时的console.log()会报错,此时的value还位于“临时死区”或TDZ中。
全局块作用域绑定
let和const与var的另一个区别是它们在全局作用域中的行为,当var被用于全局作用域时,会创建一个新的全局变量作为全局对象(浏览器环境中的window对象)的属性。var 声明的变量会无意中覆盖一个已经存在的全局属性。代码如下:
var RegExp = 'Hello'
console.log(window.RegExp) // Hello (覆盖)
块级绑定最佳实践
默认使用const,只在确定需要改变变量的值时使用let,这样就可以在某种程度上实现代码的不可变。防止某些错误的产生。
ES6块级作用域let声明和const声明以及与var之间的区别的更多相关文章
- ES6标准入门 第二章:块级作用域 以及 let和const命令
一.块级作用域 1.为什么需要块级作用域? ES5中只有全局作用域和函数作用域,带来很多不合理的场景. (1)内层变量可能会覆盖外层变量: var tem = new Date(); function ...
- ES6块级作用域及新变量声明(let)
很多语言中都有块级作用域,但JS没有,它使用var声明变量,以function来划分作用域,大括号“{}” 却限定不了var的作用域.用var声明的变量具有变量提升(declaration hoist ...
- es6 学习1 let表示变量 、const表示常量 与 var 变量的区别
一.let 1.看下代码,在函数中无论在哪里声明变量,都会自动提到函数顶部,这就是函数变量提升,它的作用于为当前函数中. function aa() { if(bool) { var test = ' ...
- ES6——块级作用域
前面的话 过去,javascript缺乏块级作用域,var声明时的声明提升.属性变量等行为让人困惑.ES6的新语法可以帮助我们更好地控制作用域.本文将详细介绍ES6新引入的块级作用域绑定机制.let和 ...
- ES6块级作用域
块级作用域的优点 避免变量冲突,比如程序中加载了多个第三方库的时候,如果没有妥善地将内部私有函数或变量隐藏起来,就很容易引发变量冲突: 可以方便的进行模块管理: 利于内存回收:(块级作用域里声明的变量 ...
- ES6 块级作用域
作用域包括:全局作用域,函数作用域,块级作用域. 为什么要用块级作用域: 1.内层变量可能会覆盖外层变量. var name = "kevin"; function call() ...
- ES6 let const 声明变量 块级作用域
ES6 中除了使用 var 定义变量,还有let.const,定义变量. function getValue(condition){ console.log(typeof value2); // un ...
- ES6入门一:块级作用域(let&const)、spread展开、rest收集
let声明 const声明 块级作用域 spread/rest 一.let声明与块作用域 在ES6之前,JavaScript中的作用域基本单元就是function.现在有了let就可以创建任意块的声明 ...
- ES6笔记(2)-- let的块级作用域
系列文章 -- ES6笔记系列 一.函数级作用域 我们都知道,在ES6以前,JS只有函数级作用域,没有块级作用域这个概念 没有块级作用域,有利有弊,利于方便自由,弊于作用域内的变量容易被共享,例如这个 ...
- 12.24 ES6浅谈--块级作用域,let
第一部分:ES6新增了块级作用域,let关键字用于声明变量,相较于var而言,let关键字不存在声明提前. 1.ES6真正的出现了块级作用域,使用双花括号括住并在其中用let声明变量,会存在暂时性死区 ...
随机推荐
- Mysql InnoDB Redo log
一丶什么是redo innodb是以也为单位来管理存储空间的,增删改查的本质都是在访问页面,在innodb真正访问页面之前,需要将其加载到内存中的buffer pool中之后才可以访问,但是在聊事务的 ...
- 【HarmonyOS】【ArkUI】在Service中使用Emitter
参考资料 1.相关基础知识:触发器Emitter2.启动服务:ServiceAbility开发 开发步骤 第一步:开发界面,界面内容由一个按钮组件+文本组件构成,然后在按钮组件中添加点击事件,开启 ...
- [ PHP 内核与扩展开发系列] 内存管理 —— 引用计数
对于 PHP 这种需要同时处理多个请求的程序来说,申请和释放内存的时候应该慎之又慎,一不小心便会酿成大错.另一方面,除了要安全申请和释放内存外,还应该做到内存的最小化使用,因为它可能要处理每秒钟数以千 ...
- [.NET学习] EFCore学习之旅 -3 一些其他的迁移命令
1.Update-DataBase xxx 概述:将数据库回滚到某个版本. 1.首先创建一个表 Dog 2.生成迁移 Add-Migration CreateDogTable 并更新到数据库 Upd ...
- Service层
package com.neu.service; import java.util.List; import com.neu.bean.User;import com.neu.dao.UserDao; ...
- 如何基于 Redis 实现分布式锁
什么是分布式锁 分布式锁:不同进程必须以互斥方式使用共享资源的一种锁方法实现. 实现分布式锁的基础 互斥.任何时刻,只有一个客户端持有锁. 无死锁.最终总是有可能获得锁,即使持有锁的客户端已经崩溃. ...
- PHP7.2 装mongodb 遇到的坑,完美解决!
公司要做QA安全测试,组长就丢了一个源码包给我,什么资料都无. 系统是个Laravel框架,源码都是从线上git下来.然后看了本地composer.json 没有生成vendor 第一步安装 comp ...
- loadrunner11汉化时提示模块插件无法注册的解决方法
安装汉化程序时,关闭杀毒软件.
- VUE项目无法启动NODE版本与NODE-SASS、SASS-LOADER版本不兼容解决方案
一.错误分析 在VUE项目开发中,我们经常会遇到报错: Node Sass version 7.0.1 is incompatible with ^4.0.0. 网上解决方案也千奇百怪,最终操作下来, ...
- 8000字详解Thread Pool Executor
摘要:Java是如何实现和管理线程池的? 本文分享自华为云社区<JUC线程池: ThreadPoolExecutor详解>,作者:龙哥手记 . 带着大厂的面试问题去理解 提示 请带着这些问 ...