1.let和const命令

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

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

2.不存在变量提升

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

eg:  var会存在变量提升

 var v='Hello';
(function(){
alert(v);
var v='World';
})() ;
//这段代码alert出来的是undefined,就是因为存在变量提升,会把定义提到前面去,赋值不会提升,变量提升之后的代码如下: var v='Hello';
(function(){
var v;
alert(v);
v='World';
})() ;

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

3.暂时性死区

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

 var tmp = 'www';
if (true) {
tmp = 'abc'; // tmp is not defined
console.log(tmp); // tmp is not defined
let tmp;
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); //
}

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

4.不允许重复声明

//以下这几种都会报错
function() {
let a = 1;
var a = 2;
} function() {
let a = 1;
let a = 2;
} function fun( arg ){
let arg;
} //不报错,两个arg属于不同的块级作用域
function fun( arg ){
{
let arg;
} }

2.块级作用域

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

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

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

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

{{{
{let aa = 'hello'}
console.log(aa); //报错
}}} {{{
{let aa = 'hello'}
let aa = 'world'; //不同的作用域可以定义同名变量
}}}

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

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

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

function f() { console.log('outside'); }
(function () {
if(false) {
function f() { console.log('inside'); }
}
f();
})() //在es5中会将函数声明提前,类似var,即会提升到全局作用域或函数作用域的头部
function f() { console.log('outside'); }
(function () {
function f() { console.log('inside'); }
if(false) {
}
f(); //声明提前会覆盖外层f() 函数,打印出inside
})() //在es6中会将函数不会将声明提前
function f() { console.log('outside'); }
(function () {
if(false) {
function f() { console.log('inside'); }
}
f(); //打印出outside
})()

4.do表达式

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

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

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. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  2. 【.net 深呼吸】跨应用程序域执行程序集

    应用程序域,你在网上可以查到它的定义,凡是概念性的东西,大伙儿只需要会搜索就行,内容看了就罢,不用去记忆,更不用去背,“名词解释”是大学考试里面最无聊最没水平的题型. 简单地说,应用程序域让你可以在一 ...

  3. 【NLP】干货!Python NLTK结合stanford NLP工具包进行文本处理

    干货!详述Python NLTK下如何使用stanford NLP工具包 作者:白宁超 2016年11月6日19:28:43 摘要:NLTK是由宾夕法尼亚大学计算机和信息科学使用python语言实现的 ...

  4. 设计模式之创建类模式大PK

                                        创建类模式大PK 创建类模式包括工厂方法模式.建造者模式.抽象工厂模式.单例模式和原型模式,他们能够提供对象的创建和管理职责.其 ...

  5. VSCode调试go语言出现:exec: "gcc": executable file not found in %PATH%

    1.问题描述 由于安装VS15 Preview 5,搞的系统由重新安装一次:在用vscdoe编译go语言时,出现以下问题: # odbcexec: "gcc": executabl ...

  6. python10作业思路及源码:类Fabric主机管理程序开发(仅供参考)

    类Fabric主机管理程序开发 一,作业要求 1, 运行程序列出主机组或者主机列表(已完成) 2,选择指定主机或主机组(已完成) 3,选择主机或主机组传送文件(上传/下载)(已完成) 4,充分使用多线 ...

  7. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  8. 3种web会话管理的方式

    http是无状态的,一次请求结束,连接断开,下次服务器再收到请求,它就不知道这个请求是哪个用户发过来的.当然它知道是哪个客户端地址发过来的,但是对于我们的应用来说,我们是靠用户来管理,而不是靠客户端. ...

  9. 深入理解javascript函数定义与函数作用域

    最近在学习javascript的函数,函数是javascript的一等对象,想要学好javascript,就必须深刻理解函数.本人把思路整理成文章,一是为了加深自己函数的理解,二是给读者提供学习的途径 ...

  10. Hadoop伪分布式集群环境搭建

    本教程讲述在单机环境下搭建Hadoop伪分布式集群环境,帮助初学者方便学习Hadoop相关知识. 首先安装Hadoop之前需要准备安装环境. 安装Centos6.5(64位).(操作系统再次不做过多描 ...