ES6 - Note1:块级作用域与常量
在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明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
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:块级作用域与常量的更多相关文章
- ES6之块级作用域
		
一.前言 在ECMAScript6(以下简称ES6)之前,ECMAScript的作用域只有两种: 1. 全局作用域: 2. 函数作用域. 正是因为有这两种作用域,所以在JavaScript中出现一 ...
 - ES6(块级作用域)
		
我们都知道在javascript里是没有块级作用域的,而ES6添加了块级作用域,块级作用域能带来什么好处呢?为什么会添加这个功能呢?那就得了解ES5没有块级作用域时出现了哪些问题. ES5在没有块级作 ...
 - ES6的 let const  以及块级作用域
		
let声明变量 用法类似于var,但是所声明的变量只在let所在的代码块内有效. 1 . 在ES6环境下,let声明的变量不能在声明之前调用. 例: console.log(i); //会报错,这叫做 ...
 - ES6标准入门 第二章:块级作用域 以及 let和const命令
		
一.块级作用域 1.为什么需要块级作用域? ES5中只有全局作用域和函数作用域,带来很多不合理的场景. (1)内层变量可能会覆盖外层变量: var tem = new Date(); function ...
 - ES6 块级作用域
		
作用域包括:全局作用域,函数作用域,块级作用域. 为什么要用块级作用域: 1.内层变量可能会覆盖外层变量. var name = "kevin"; function call() ...
 - ES6-let、const和块级作用域
		
1.介绍 总的来说,ES6是在ES2015的基础上改变了一些书写方式,开放了更多API,这样做的目的最终还是为了贴合实际开发的需要.如果说一门编程语言的诞生是天才的构思和实现,那它的发展无疑就是不断填 ...
 - ECMAScript6 入门教程 初学记录let命令 块级作用域
		
一.基本语法-let命令 (1)ES6新增了let命令,用来声明变量.所声明的变量,只在let命令所在的代码块内有效. 循环的计数器,就很合适使用let命令.计数器i只在for循环体内有效,在循环体外 ...
 - js中的块级作用域
		
概述 函数是js中最常见的作用域单元, 声明在一个函数内部的变量或函数会在所处的作用域中隐藏起来, 这是有意为之的非常好的设计原则. 但是随着js的发展, 我们有了某个代码块(通常指{..}内部)隐藏 ...
 - 从函数作用域和块级作用域看javascript的作用域链
		
在ES6之前,javascript只有全局作用域和函数作用域.所谓作用域就是一个变量定义并能够被访问到的范围.也就是说如果一个变量定义在全局(window)上,那么在任何地方都能访问到这个变量,如果这 ...
 
随机推荐
- java 的各种实用类库(jar包)
			
总列表:# dom4j # org.json # pinyin4j # sqlite-jdbc # JavaMail # JLayer # dom4j 介绍:处理 xml 的类库.采用了 Java 集 ...
 - JS /JQuery 获取变量为数字时 容易出错  可能不是数字类型
			
Javascript内置函数,原型为parseInt ( String s , [ int radix ] ),用于解析一个字符串,并返回一个整数. var $prod_kucun=$(this).n ...
 - oracle表空间简单学习
			
1.重命名表空间:alter tablespace 原表空间名 rename to 新表空间名ps:(1)system 和sysaux表空间不能重名(2)如果该表空间中任何一个数据出于脱机状态或者表空 ...
 - Python3.5 Day2作业:购物车程序
			
需求: 1. 启动程序后,用户通过账号密码登录,然后打印商品列表. 2. 允许用户根据商品编号购买商品. 3. 用户选择商品后,检测余额是否足够,够就直接扣款,不够就提醒充值. 4. 可随时退出,退出 ...
 - id选择器、类选择器、属性选择器
			
在网页编辑时,通常要对样式进行各种设置.我们借助CSS样式设计中的选择器,就能很好很方便的对它们进行管理和设置了. 今天,跟大家分享一下几个常用的选择器:id选择器.类选择器.属性选择器. id选择器 ...
 - Files 的值“<<<<<<< .mine”无效。路径中具有非法字符
			
解决冲突,告诉SVN这个问题已解决(Resolved). 一般更简单些:在你的工程OBJ/DEBUG目录下,找到 工程名.csproj.FileListAbsolute.txt的文件打开并删除含有'& ...
 - DNS域名服务器
			
DNS是用来解析域名的,IP就相当于地址一样,不知道IP就没法访问指定网络.要上PC6下载站,输入www.pc6.com, 得先问问DNS大哥www.pc6.com在哪,然后Dns告诉你后,就上去了w ...
 - Apache与Nginx区别
			
1.nginx相对于apache的优点: 轻量级,同样起web 服务,比apache占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx ...
 - sass学习总结
			
SASS是一种CSS的开发工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单和可维护.个人简单总结了下比较常用的的一些东西. $ 开头定义变量名 是个全局变量 在{ $ ...
 - C语言中的sizeof()
			
sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着"辛苦我一个,幸福千万人"的伟大思想,我决定将其尽可能详细的总结一下. 但当我总结的时候才发现,这个 ...