1.let和const命令

1.es6新增了let和const命令,与var用法类似,但它声明的变量只在let所在的代码块内有效(块级作用域,es5只有全局和函数作用域)

  1. {
  2. let a = 1;
  3. var b = 2;
  4. }
  5. console.log(a); //a is not defined let声明的变量只在自己的块内有效
  6. console.log(b); //
  1. var a = [];
  2. for(avr i = 0; i < 10; i++){
  3. a[i] = function() {
  4. console.log(i)
  5. };
  6. }
  7.  
  8. a[3](); //
  9. //a[3])() 打印出来是10,i是var声明的,在全局范围内都有效,所以每一次循环,新的i值都会覆盖旧值,所以最后i是10
  10.  
  11. var a = [];
  12. for(let i = 0; i < 10; i++){
  13. a[i] = function() {
  14. console.log(i)
  15. };
  16. }
  17. a[3](); //
  18. //a[3]() 打印出来是3,变量i是let声明的,且仅在块级作用域内有效,每个i都是不同的作用域,所以最后输出3

2.不存在变量提升

变量提升的意思是把下边的东西提到上面,在JS中,就是把定义在后面的东西(变量或函数)提升到前面来定义。

eg:  var会存在变量提升

  1. var v='Hello';
  2. (function(){
  3. alert(v);
  4. var v='World';
  5. })() ;
  6. //这段代码alert出来的是undefined,就是因为存在变量提升,会把定义提到前面去,赋值不会提升,变量提升之后的代码如下:
  7.  
  8. var v='Hello';
  9. (function(){
  10. var v;
  11. alert(v);
  12. v='World';
  13. })() ;

使用let命令就不会存在变量提升,所以一定要先声明后使用。

3.暂时性死区

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

  1. var tmp = 'www';
    if (true) {
  2. tmp = 'abc'; // tmp is not defined
  3. console.log(tmp); // tmp is not defined
  4. let tmp;
  5. console.log(tmp); // undefined
  6. tmp = 123;
  7. console.log(tmp); //
  8. }

es6使用let和const,是为了避免var没有声明就使用所带来的一些问题。

4.不允许重复声明

  1. //以下这几种都会报错
  2. function() {
  3. let a = 1;
  4. var a = 2;
  5. }
  6.  
  7. function() {
  8. let a = 1;
  9. let a = 2;
  10. }
  11.  
  12. function fun( arg ){
  13. let arg;
  14. }
  15.  
  16. //不报错,两个arg属于不同的块级作用域
  17. function fun( arg ){
  18. {
  19. let arg;
  20. }
  21.  
  22. }

2.块级作用域

1.在es5中没有块级作用域

  1. //第一种场景:内层变量覆盖外层变量
    var tmp = new Date();
  2. function f() {
  3. console.log(tmp);
  4. if (false) {
  5. var tmp = 'hello world!'
  6. }
  7. }
  8. f(); //undefined 变量提升,内层变量覆盖了外层变量
  9.  
  10. //第二种场景:循环变量泄露为全局变量
  11. var s = 'hello';
  12. for (var i = 0; i < s.length; i++) {
  13. console.log(s[i]);
  14. }
  15. onsole.log(i); // 5 循环结束后 i泄露为全局变量

2.es6的块级作用域,let和const

一对{}就代表一个块级作用域,可以任意嵌套

  1. {{{
  2. {let aa = 'hello'}
  3. console.log(aa); //报错
  4. }}}
  5.  
  6. {{{
  7. {let aa = 'hello'}
  8. let aa = 'world'; //不同的作用域可以定义同名变量
  9. }}}

3.块级作用域与函数声明

在es5的严格模式下,函数不能在块级作用域中声明,但浏览器没有遵守这个规定,在非严格模式下是可以运行的。es5的块级作用域如:if(true){}、try{}.

es6明确允许在块级作用域中声明函数。函数声明类似于let,只在块级作用域中有效。

  1. function f() { console.log('outside'); }
  2. (function () {
  3. if(false) {
  4. function f() { console.log('inside'); }
  5. }
  6. f();
  7. })()
  8.  
  9. //在es5中会将函数声明提前,类似var,即会提升到全局作用域或函数作用域的头部
  10. function f() { console.log('outside'); }
  11. (function () {
  12. function f() { console.log('inside'); }
  13. if(false) {
  14. }
  15. f(); //声明提前会覆盖外层f() 函数,打印出inside
  16. })()
  17.  
  18. //在es6中会将函数不会将声明提前
  19. function f() { console.log('outside'); }
  20. (function () {
  21. if(false) {
  22. function f() { console.log('inside'); }
  23. }
  24. f(); //打印出outside
  25. })()

4.do表达式

 因为块级作用域是一个语句,没有返回值,外界无法访问里面的值,如果加上do,块级作用域就变成了表达式,可以有返回值。

  1. //这是一个语句,外部无法拿到t值
  2. {
  3. let t = f();
  4. t = t * t + 1;
  5. }
  6.  
  7. //加上do,就变成表达式, x会得到整个块级作用域的返回值
  8. let x = do {
  9. let t = f();
  10. t * t + 1;
  11. }

3.const命令

const命令与let命令用法相似,const声明的是一个只读的常亮,一旦声明,值就不能改变,对const来说,不能只声明不赋值。

es6小白学习笔记(一)的更多相关文章

  1. es6.3学习笔记

    es版本发布相当快,从1.x到2.x,再直接到5.x,6.x 索引这个词在es中有多重意思: 索引(名词):一个索引类似于传统数据库中的一个索引,用于存储关系型文档.索引的复数为indexes或ind ...

  2. JavaScript(ES6)学习笔记-Set和Map数据结构(一)

    一.Set 1.ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值. Set 本身是一个构造函数,用来生成 Set 数据结构. , , , , ']); s; // ...

  3. ES6 promise学习笔记 -- 基本用法

    ES6 规定,Promise对象是一个构造函数,用来生成Promise实例. 下面代码创造了一个Promise实例. const promise = new Promise(function(reso ...

  4. ES6 Generator 学习笔记一

    Generator 函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同. Generator 函数有多种理解角度.从语法上,首先可以把它理解成,Generator 函数是一个状态机 ...

  5. ------------------java collection 集合学习 ----小白学习笔记,,有错,请指出谢谢

    <!doctype html>java对象集合学习记录 figure:first-child { margin-top: -20px; } #write ol, #write ul { p ...

  6. 珠峰 - 郭永峰react课程 node es6 babel学习笔记

    npm install babel-cli -g //安装babel babel index.js -o a.js //等同于 babel index.js --out-file a.js 复制ind ...

  7. Swoft2.x 小白学习笔记 (一) ---控制器

    Swoft通过官方文档进行学习,这里不做介绍,直接上手. 涉及到Swoft方面:(配置.注意的坑) 1.控制器(路由.验证器.中间件) 2.mysql  (Model使用).Redis配置及通用池 3 ...

  8. JavaScript(ES6)学习笔记-Set和Map与数组和对象的比较(二)

    一.Map,Set,Array对比: 1.增 let map = new Map(); let set = new Set(); let array = []; map.set('t',1); //M ...

  9. vue小白学习笔记

    <div id="div"> <h2>{{ key }}</h2> </div> new Vue ({ el : "#di ...

随机推荐

  1. 怎么让网站在本地支持SSL?

    打开vs,点击项目,查看属性,打开ssl 如果有什么危险提示,就允许 右击项目,选择属性 运行项目

  2. Sublime配置python开发环境

    Package Control Package Control 是Sublime 里直接安装附加插件的包管理器.可以通过以下步骤手动安装: 1.点击Preferences > Browse Pa ...

  3. C# 多种方式发送邮件(附帮助类)

    因项目业务需要,需要做一个发送邮件功能,查了下资料,整了整,汇总如下,亲测可用- QQ邮箱发送邮件 #region 发送邮箱 try { MailMessage mail = new MailMess ...

  4. 前端学HTTP之重定向和负载均衡

    前面的话 HTTP并不是独自运行在网上的.很多协议都会在HTTP报文的传输过程中对其数据进行管理.HTTP只关心旅程的端点(发送者和接收者),但在包含有镜像服务器.Web代理和缓存的网络世界中,HTT ...

  5. SQL Server-聚焦在视图和UDF中使用SCHEMABINDING(二十六)

    前言 上一节我们讨论了视图中的一些限制以及建议等,这节我们讲讲关于在UDF和视图中使用SCHEMABINDING的问题,简短的内容,深入的理解,Always to review the basics. ...

  6. 带你实现开发者头条APP(三) 首页实现

    title: 带你实现开发者头条APP(三) 首页实现 tags: 轮播广告,ViewPager切换,圆形图片 grammar_cjkRuby: true --- 一.前言 今天实现开发者头条APP的 ...

  7. OpenGL超级宝典笔记----框架搭建

    自从工作后,总是或多或少的会接触到客户端3d图形渲染,正好自己对于3d图形的渲染也很感兴趣,所以最近打算从学习OpenGL的图形API出发,进而了解3d图形的渲染技术.到网上查了一些资料,OpenGL ...

  8. 数据图表插件Echarts(一)

    一.引言 最近做一个智慧城市项目,项目中需要图表和报表进行数据分析,从网上找了很多,最后找到了百度开放的echarts,一个很强大的插件. 二.介绍 ECharts,缩写来自Enterprise Ch ...

  9. node中的Stream-Readable和Writeable解读

    在node中,只要涉及到文件IO的场景一般都会涉及到一个类-Stream.Stream是对IO设备的抽象表示,其在JAVA中也有涉及,主要体现在四个类-InputStream.Reader.Outpu ...

  10. 七牛云:ckeditor JS SDK 结合 C#实现多图片上传。

    成功了,搞了2天.分享一下经验. 首先是把官方的那个例子下载下来,然后照如下的方式修改. 其中tempValue是一个全局变量. function savetoqiniu() { var upload ...