在ES6以前,ES不支持块级作用域,只有全局作用域和函数作用域,所有变量的声明都存在变量声明提升。

1.let 关键字

声明一个块级变量,只在一个代码块中有效,如果在块外面访问便会报错,如下所示:

{ let a = 1; var b = 1; } a;b;
ReferenceError: a is not defined //没有定义

let命令非常适合循环语句,如下所示

var a = [];
for( let j=0; j<9 ;j++){ a[j] = function(){ console.log(j); } }
a[5]();
5

如果换成var命令,这里的输出将变成9,如下所示

var a = [];
for( var j=0; j<9 ;j++){ a[j] = function(){ console.log(j); } }
a[5]();
9
//这里可以使用闭包来强制使程序符合预期
var a = [];
for (var j = 0; j < 9; j++) {
a[j] = (function(i) {
return function() {
  console.log(i);
}})(j);
}
a[5]();
5

let不存在变量声明提升,必须先定义后使用,且不允许重复定义,如下所示

z; let z = 1;
ReferenceError: can't access lexical declaration `z' before initialization
{ let a = 1; var a = 1; }
SyntaxError: redeclaration of let a

ES6明确规定,如果区块中存在letconst命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

ES6的块级作用域允许多层嵌套,且互不干扰,如下所示

{ let a = 2; console.log(a); { let a= 1; console.log(a); }}
2
1

2.const关键字

使用const关键字可以声明一个常量,该常量是只读的,不可修改且也是块级作用域,类似c++的指针常量。如下所示

{ const PI = 3.1415; PI; } PI;
ReferenceError: PI is not defined { const PI = 3.1415; PI=3; } ;
TypeError: invalid assignment to const `PI' //不可修改 //如果常量指向一个复合对象,该常量的数据可以修改,但是地址不可以修改,和c++指针常量的概念一样
const a = {}; a.msg = "hello world"; a.msg;
"hello world"
a.msg = "hello es6!";
"hello es6!"
a
Object { msg: "hello es6!" }
a = {}
TypeError: invalid assignment to const `a'

如果想彻底冻结一个对象,可以使用ES5的Object.freeze函数,有兴趣的可以去了解Object.preventExtensions(),Object.seal(),Object.freeze(),preventExtensions可以阻止对象扩张属性,但不能阻止对现有属性的修改删除,seal可以密封对象,阻止添加新属性,但可以修改现有属性,不可删除现有属性,freeze冻结对象,不可添加属性且修改现有属性

ES6 - Note1:块级作用域与常量的更多相关文章

  1. ES6之块级作用域

    一.前言 在ECMAScript6(以下简称ES6)之前,ECMAScript的作用域只有两种: 1.  全局作用域: 2.  函数作用域. 正是因为有这两种作用域,所以在JavaScript中出现一 ...

  2. ES6(块级作用域)

    我们都知道在javascript里是没有块级作用域的,而ES6添加了块级作用域,块级作用域能带来什么好处呢?为什么会添加这个功能呢?那就得了解ES5没有块级作用域时出现了哪些问题. ES5在没有块级作 ...

  3. ES6的 let const 以及块级作用域

    let声明变量 用法类似于var,但是所声明的变量只在let所在的代码块内有效. 1 . 在ES6环境下,let声明的变量不能在声明之前调用. 例: console.log(i); //会报错,这叫做 ...

  4. ES6标准入门 第二章:块级作用域 以及 let和const命令

    一.块级作用域 1.为什么需要块级作用域? ES5中只有全局作用域和函数作用域,带来很多不合理的场景. (1)内层变量可能会覆盖外层变量: var tem = new Date(); function ...

  5. ES6 块级作用域

    作用域包括:全局作用域,函数作用域,块级作用域. 为什么要用块级作用域: 1.内层变量可能会覆盖外层变量. var name = "kevin"; function call() ...

  6. ES6-let、const和块级作用域

    1.介绍 总的来说,ES6是在ES2015的基础上改变了一些书写方式,开放了更多API,这样做的目的最终还是为了贴合实际开发的需要.如果说一门编程语言的诞生是天才的构思和实现,那它的发展无疑就是不断填 ...

  7. ECMAScript6 入门教程 初学记录let命令 块级作用域

    一.基本语法-let命令 (1)ES6新增了let命令,用来声明变量.所声明的变量,只在let命令所在的代码块内有效. 循环的计数器,就很合适使用let命令.计数器i只在for循环体内有效,在循环体外 ...

  8. js中的块级作用域

    概述 函数是js中最常见的作用域单元, 声明在一个函数内部的变量或函数会在所处的作用域中隐藏起来, 这是有意为之的非常好的设计原则. 但是随着js的发展, 我们有了某个代码块(通常指{..}内部)隐藏 ...

  9. 从函数作用域和块级作用域看javascript的作用域链

    在ES6之前,javascript只有全局作用域和函数作用域.所谓作用域就是一个变量定义并能够被访问到的范围.也就是说如果一个变量定义在全局(window)上,那么在任何地方都能访问到这个变量,如果这 ...

随机推荐

  1. c和oc小知识

    1.const const 修饰了*p1 / *p2 const int * p1=&age; int const * p2=&age;//和上面的意义一样 ,换句话说就是 在 “ * ...

  2. ubuntu 16.04 Dockerfile 安装mysql

    默认上MariaDB的包并没有在Ubuntu仓库中.要安装MariaDB,我们首先要设置MariaDB仓库. 配置MariaDB 仓库 # apt-get install software-prope ...

  3. perl学习之路2

    这些主要是从 "小骆驼" 书上粘贴或者摘抄出来的, 个人认为需要记的语法知识 "在某些情况下, 你可能需要在一台机器上写程序, 再传送到另一台机器上运行.这时候, 请使用 ...

  4. Java 用程序给出随便大小的10 个数,序号为1-10,按从小到大顺序输出,并输出相应的序号?

    import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.uti ...

  5. CSS外边距叠加问题

    CSS外边距叠加就是margin-collapse,边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距,水平边 距永远不会重合.重叠结果计算规则:①.两个相邻的外边距都是正数时,折叠结果是它 ...

  6. hexo建个人博客

    已经在腾讯云获得了域名和服务器,想着既然已经这样了,就折腾折腾自己的个人博客主页吧. 考虑再三决定用github pages来实现我的博客.github Pages可以被认为是用户编写的.托管在git ...

  7. Hibernate框架使用案例

    Hibernate是对JDBC进行了轻量级封装的ORM框架,充当项目的持久层 Hibernate依赖的库: 创建一个工程,添加jar包: hibernate.cfg.xml: <!DOCTYPE ...

  8. 前端-SEO

    SEO是 search Engine Optimization   (搜索引擎优化) SEO: ①白帽SEO(普通SEO做的优化) 网站标题.关键字.描述 网站内容优化 Robot.txt文件 网站地 ...

  9. 使用Javascript来实现二级联动菜单的效果

    效果图如下: 具体实现步骤如下: 1.所用js代码如下: <script type="text/javascript"> var arr_province=[" ...

  10. 线上应用bug跟踪查找-友盟统计

    线上的应用只要用心点点都能发现些bug,连微信,QQ也不列外.但是bug中最严重的算是闪退了,这导致了用户直接不能使用我们的app. 我们公司是特别注重用户反馈和体验的,我们会定期打电话咨询用户的使用 ...