es6学习 1
块级作用域绑定
一 var 声明及变量提升(Hoisting)机制
在函数作用域或全局作用域中通过 var 声明的变量,无论实际上是在哪里声明的,都会被当成在当前作用域顶部声明的变量,这就是我们常说的提升(Hoisting)机制。下面以一个函数为例来说明:
function getValue(condition)
{
if (condition){
var value = "blue";
// 其他代码
return value; }else
{
// 此处可访问变量 value,其值为undefined
return null; }
}
如果你不熟悉 JavaScript,可能会认为只有当 condition 的值为 true 时才会创建变量 value 。事实上,无论如何变量 value 都会被创建。在编译阶段,JavaScript 引擎会将上面的 getValue 函数修改成下面这样:
function getValue (condition){
var value;
if (condition){
value = "blue";
// 其他代码
return value;
}
else{
return null;
}
}
变量 value 的声明被提升至函数顶部,而初始化操作依旧留在远处执行,这就意味着在 else 子句中也可以访问到该变量,且由于此时变量尚未初始化,所以其值为 undefined。
二 块级声明
块级声明用于声明在指定块的作用域之外无法访问的变量。块级作用域(亦被称为词法作用域)存在于:
- 函数内部
- 块中(字符{和}之间的作用域)
很多类 C语言都有块级作用域,而 ECMAScript 6 引入块级作用域就是为了让 JavaScript 更灵活更普遍。
let 声明
let 声明的用法与 var 相同。 用 let 代替 var 来声明变量,就可以把变量的作用域限制在当前代码块中。由于 let 声明不会被提升,因此开发者通常将 let 声明语句放在封闭代码块的顶部,以便整个代码块都可以访问。下面是 let 声明的示例:
function getValue(condition)
{
if (condition){
var value = "blue";
// 其他代码
return value; }else
{
// 变量 value 在此处不存在
return null; }
// 变量 value 在此处不存在
}
禁止重声明
假设作用域中已经存在某个标识符,此时在用 let 关键字声明它就会抛出错误,举例来说:
var count = 30; // 抛出错误
let count = 10;
在这个示例中,变量 count 被声明了两次:一次是用 var 关键字,一次是用 let 关键字。如前所述,同一作用域中不能用 let 重复定义已经存在的标识符,所以此处的 let 声明会抛出错误。但如果当前作用域内嵌另一个作用域,便可在内嵌作用域中用 let 声明同名变量,示例代码如下:
var count = 30;
if (condition){
// 不会抛出错误
let count = 40;
// 更多代码
}
由于此处的 let 实在 if 块内声明了新变量 count ,因此不会抛出错误,内部块中的 count 会遮蔽全局作用域中的 count,后者只有在 if 块外才能访问到。
const 声明
ECMAScript 6 标准还提供了 const 关键字。使用 const 声明的是常量,其值一旦被设定后不可被更改。因此,每个通过 const 声明的常量必须进行初始化,示例如下:
const maxItems = 30; // 没有问题 const name;// 语法错误,常量未初始化
在这里声明 maxItems 时进行了初始化操作,而声明 name 时没有进行赋值,因此之行后者时会抛出语法错误。
conse 和 let
const 与 let 声明都是块级标识符,所以常量也只有在当前代码块内有效,一旦执行到块外会立即被销毁。常量同样也不会被提升至作用域顶部,示例代码如下:
if (condition){
const maxItems = 5;
// 更多代码 } // 此处无法访问 maxItems
在这段代码中,在 if 语句中声明了常量 maxItems, 语句执行一结束,maxItems 即刻被销毁,在代码块外访问不到这个常量。
与 let 相似,在同一作用域 中用 const 声明已经存在的标识符也会导致语法错误,无论该标识符使用 var ,还是 let 声明的。举例来说:
var message = "hello!";
let age = 5; // 这两条语句都会抛出错误
const message = "Goodbye!";
const age = 30;
后两条 const 声明语句本身没问题,但由于前面的 var 和 let 声明了两个同名变量,结果代码就无法执行了。
用 const 声明对象
记住,const 声明不允许修改绑定,但允许修改值。这就意味着用 const 声明对象后,可以修改该对象的属性值。举个例子:
const max = 5;
// 抛出语法错误
max = 6; const person = {
name = "wz"
};
// 可以修改对象属性的值
person.name = 'mm'; //抛出语法错误 person = {
name = "mm"
}
这段代码中,绑定 person 的值是一个包含一个属性的对象,改变person.name 的值,不会抛出任何错误,因为修改的是 person 包含的值。如果直接给 person 赋值,即要改变 person 的绑定,就会抛出错误。切记 const 声明不允许修改绑定,但允许修改绑定的值。
es6学习 1的更多相关文章
- ES6学习目录
前面的话 ES6是JavaScript语言的下一代标准,已经在 2015 年 6 月正式发布.它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言 为什么要学 ...
- es6学习笔记-class之继承
继承 上一篇学习了class的概念,在es5时,对象的继承有好几种,原型链继承,借用构造函数继承,组合继承,原型式继承,寄生式继承以及寄生组合式继承,都是按照函数的形式去集成的,现在class也有它的 ...
- es6学习笔记-class之一概念
前段时间复习了面向对象这一部分,其中提到在es6之前,Javasript是没有类的概念的,只从es6之后出现了类的概念和继承.于是乎,花时间学习一下class. 简介 JavaScript 语言中,生 ...
- javascript的ES6学习总结(第二部分)
1.数组循环 介绍数组循环之前,先回顾一下ES5数组的循环 (1)数组遍历(代替普通的for):arr.forEach(callback(val,index,arr){todo}) //val是数组的 ...
- javascript的ES6学习总结(第一部分)
ES6(ESNext学习总结——第一部分) ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发版. ECMA每年6月份,发布一个版本 201 ...
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
- ES6学习笔记<四> default、rest、Multi-line Strings
default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...
- ES6学习笔记<三> 生成器函数与yield
为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...
- ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring
接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...
- ES6学习笔记<一> let const class extends super
学习参考地址1 学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...
随机推荐
- 数据挖掘潜规则zz
声明:本文指的是做数据挖掘这行,不是数据仓库 我干这行有几年了,见了很多人,干了很多公司,爆一爆这个行业的状况吧……让后来人有所了解,也让猎头挖人挖的有点方向,起码和candidates聊天的时候不至 ...
- 从Objective-C到Swift,你必须会的(二)组合options
用过Options这个东西的人都知道,几个竖线就把这些值都和到一起了.比如: + (NSStringDrawingOptions)combine{ return NSStringDrawingTrun ...
- Linux 基础教程 41-系统关机和重启
在Linux系统中,仅仅是关机和重启相关的命令就至少有5个,shutdown. halt.poweroff.reboot.init.各个命令作用如下所示: 命令 说明 shutdown 可用于 ...
- POJ1789 Truck History 2017-04-13 12:02 33人阅读 评论(0) 收藏
Truck History Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 27335 Accepted: 10634 D ...
- 洛谷 P1967 货车运输(克鲁斯卡尔重构树)
题目描述 AAA国有nn n座城市,编号从 11 1到n nn,城市之间有 mmm 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 qqq 辆货车在运输货物, 司机们想知道每辆车在不超过车 ...
- Android-Gson解析JSON数据(JSON对象/JSON数组)
上一篇博客,Android-解析JSON数据(JSON对象/JSON数组),介绍了使用 org.json.JSONArray;/org.json.JSONObject; 来解析JSON数据: Goog ...
- cocos2dx常见Action(转)
本文转载自:http://blog.csdn.net/ff313976/article/details/23667209 bool HelloWorld::init(){ ////////////// ...
- c#格式化字符
1.格式化货币(跟系统的环境有关,中文系统默认格式化人民币,英文系统格式化美元) string.Format("{0:C}",0.2) 结果为:¥0.20 (英文操作系统结果:$0 ...
- PostSharp 结合 log4net 自动记录日志
环境: VS 2012 PostSharp-4.1.28 (下载地址)https://visualstudiogallery.msdn.microsoft.com/a058d5d3-e654-43f ...
- DataGridViewComboBoxColumn值无效解决方法
值无效,可能是你下拉框选项,没有这样的值,而你却设置这个值. dataGridView1.Rows[i].Cells[1].Value = "选项一"; 解决方法就是在窗体的构造函 ...