ECMAScript 6中的let和const关键词
ECMAScript 6中多了两个定义变量的关键词,一个是let,另一个是const,后者顾名思义就是常量定义,前者的作用域范围是块级的。
一般写过js的童鞋都知道,同其他语言一样,JS中的变量作用域是函数域而不是块级分割的,但是涉及到变量提升(hosting),闭包等问题的时候,很多有经验的程序员依然会头疼。
var a = 5;
if(true){
var a = 10;
}
console.log(a);//
上面的结果是10,但是我们看到,在if block内外都有一个a的定义,按我们正常的理解来看,这两个a应该占用的是不同的内存,而事实上,他们共用同一个内存。为此,ES 6中的let关键词“修复”了这个问题。
let a = 5;
if(true){
let a = 10;
}
console.log(a); //
let作用在块级作用域中,所以不管是switch还是if还是for,只要是let定义的变量,他就只能在那个花括号内部起作用。let是一个让程序员比较省心的一个关键词,而还有一个令人兴奋的关键词是let的兄弟const,一旦定义一个变量为const类型,后面就不能对他进行修改。
const aa = 11;
alert(aa) //
aa = 22;
alert(aa) //
关于这两者的兼容性问题,可以到这里查看http://kangax.github.io/es5-compat-table/es6/
Node已经支持了const和let关键词,可以这样使用node --harmony
和use strict
。目前一些浏览器还不支持这样的写法,但是利用defs.js这个库可以ES3也支持这个。他的原理就是利用esprima来编译并重写你的代码。比如:
"use strict";
function fn() {
const y = 0;
for (let x = 0; x < 10; x++) {
const y = x * 2;
const z = y;
}
console.log(y); // prints 0
}
fn();
经过def.js重新编译之后变成:
"use strict";
function fn() {
var y = 0;
for (var x = 0; x < 10; x++) {
var y$0 = x * 2;
var z = y$0;
}
console.log(y); // prints 0
}
fn();
详情可以去https://github.com/olov/defs这里瞅瞅。
本文同步自我的github博客。
ECMAScript 6中的let和const关键词的更多相关文章
- ECMAScript 6中的var,let,const
var的变量提升 console.log(a); //输出undefined ; 他的实际执行顺序是: var a: console.log(a); a= 这就是var的变量提升 const命令的用法 ...
- let和const关键词
ECMAScript 6中的let和const关键词 2013-11-28 21:46 by BarretLee, 21 阅读, 0 评论, 收藏, 编辑 ECMAScript 6中多了两个定义变量的 ...
- ES6中的var let const应如何选择
javascript世界里面的每个人都在说有关ECMAScript 6 (ES6,也称作ES 2015)的话题,对象的巨大变化 ( 类 , super() , 等), 函数 (默认参数等), 以及模块 ...
- 详解ES6中的 let 和const
前 言 JRedu ECMAScript 6 是 JavaScript 语言教程,全面介绍 ECMAScript 6 新引入的语法特性. ES6 与上一个版本 ES5 的所有不同之处,对涉及的语 ...
- c++中的auto、const auto&
先介绍一下auto.const: 在块作用域.命名作用域.循环初始化语句等等 中声明变量时,关键词auto用作类型指定符. const:修饰符 接下来我们细细分析一下: (1)auto auto即 ...
- 在php中定义常量时,const与define的区别?
问]在php中定义常量时,const与define的区别? [答]使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数.另外const在编译时要比define快很 ...
- ECMAScript 5中属性的特性值
这是<JavaScript高级程序设计(第三版)>第六章相关内容的总结. ECMAScript中有两种属性:数据属性和访问器属性.每种属性都有四个特性值. 数据属性的四个特性值: [[Co ...
- C++中 容易忽视的const 修饰符
C++可以用const定义常量,也可以用#define定义常量,但是前者比后者有更多的有点: (1)const常量有数据类型,而宏常量没有数据类型.编译器可以对const进行类型安全检查,而后者只进行 ...
- ECMASCRIPT 6中字符串的新特性
本文将覆盖在ECMAScript 6 (ES6)中,字符串的新特性. Unicode 码位(code point)转义 Unicode字符码位的长度是21位[2].而JavaScript的字符串,是1 ...
随机推荐
- Android框架之AndroidAnnotations详细讲解
一: (1)一个activity如过使用AndroidAnnotions注入时, 那么它在 AndroidManifest.xml注册时,应该加入_ 比如: MainActivity的注册时 < ...
- UI设计中px、pt、ppi、dpi、dp、sp之间的关系
UI设计中px.pt.ppi.dpi.dp.sp之间的关系 武汉AAA数字艺术教育 2015-07-24 14:19:50 职业教育 pi px 阅读(3398) 评论(0) 声明:本文由入驻搜狐公众 ...
- iOS TableView如何刷新指定的cell或section
指定的section单独刷新 NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:indexPath.row]; [tableview relo ...
- Ajax提交与传统表单提交的区别说明
Ajax提交是通过js来提交请求,请求与响应均由js引擎来处理,页面不会刷新,用户感觉不到实际上浏览器发出了请求.比如说我们希望网页总是显示最新的新闻,而又不想老是去点刷新按钮,我们就可以用Ajax机 ...
- vs2015里给c#添加轮廓折叠功能
轮廓折叠,在看代码时非常有用的功能,可以暂时屏蔽大段不相关的if/else分支 记得以前老版vs里是自带这功能的,c++和c#都有 但不知为啥最新的2015里c#没有了,搜了下原来是要装插件: htt ...
- aa4
// 初始化地图 var BMapExt = new BMapExtension(domMain, BMap, require('echarts'), require('zrender')); var ...
- sublime配置coffeeScript
node.js 全局模块所在目录 npm -g ls 1.安装 npm install -g coffee-script 2.sublime安装CoffeeScript sublime语法高亮插件 ...
- Sprint 3 回顾与总结 和团队贡献分 以及Sprint 1、2、3 总概
团队情况: 团队名称:Heaven Fire 团队博客地址:https://home.cnblogs.com/u/gjpg/ 团队Github地址:ht ...
- Rancher 快速上手指南操作(1)
Rancher 快速上手指南操作(1)该指南知道用户如何快速的部署Rancher Server 管理容器.前提是假设你的机器已经安装好docker了.1 确认 docker 的版本,下面是 ubunt ...
- kernel 对浮点的支持
http://blog.chinaunix.net/uid-22545494-id-316735.html 作者: Sam(甄峰) sam_code@hotmail.com 一:早期ARM上的浮点模 ...