ECMAScript6-let和const命令
▓▓▓▓▓▓ 大致介绍
ES6是下一代的JavaScript语言的标准,目标是让JavaScript可以用来编写大型的复杂程序,成为企业级开发语言,要查看浏览器对ES6的支持程度可以用阮一峰大佬写的工具ES-Checker
安装:(需要安装npm(心累),推荐用cnpm)
npm install -g es-checker
es-checker
效果(有具体的支持情况):
▓▓▓▓▓▓ let
let命令,和var的作用一样,都是用来声明变量,只是let命令只在所在的代码块内有效
经典的例子:
var a = []; for(var i=0;i<10;i++){
a[i] = function(){
console.log(i);
}
} a[4](); //
console.log(i); //
经典的例子,就不赘述,这里a数组都是引用的同一个i
改用 let:
var a = []; for(let i=0;i<10;i++){
a[i] = function(){
console.log(i);
}
} a[4](); //
console.log(i); // ReferenceError: i is not defined
这里i用let声明,就只在本次循环中存在,每次循环都会创建一个i
注意:在for循环中,循环语句是一个作用域,而循环体内部又是一个子作用域
例如:
for(let i=0;i<3;i++){
let i = 'abd';
console.log(i);
} //abd
//abd
//abd
可以看出循环体内的i和循环语句中的i是分离的
▓▓▓▓▓▓ let的特点
1、不存在变量提升
console.log(a); //undefined
var a = '123'; console.log(b);
let b = '123'; //ReferenceError: b is not defined
2、暂时性死区
如果在一个块级作用域内有let命令,那他声明的变量就绑定这个块级作用域,不受外部的影响
var a = '123'; if(true){
a = '456';
console.log(a); //ReferenceError: a is not defined let a;
console.log(a); //undefined
}
ES6明确规定,如果区块中存在let或者const命令,这个区块对这些命令声明的变量,从一开始就形成封闭作用域,凡是在声明之前使用这些变量都会报错
这里a是用let声明的,所以在let声明之前使用a都会报错
3、不能重复声明
let不允许在同一个作用域内,声明同一个变量
//报错
{
var a = '123';
let a = '456';
} //报错
{
let a = '123';
var a = '456';
} //报错
{
let a = '123';
let a = '123';
}
注意:在函数内不能重复声明参数
//报错
function test(target) {
let target;
} //不报错
function test(target){
{
let target;
}
}
在第二个函数里不报错,是应为{}中时一个新的子作用域,和参数target不是在同一个块内了
▓▓▓▓▓▓ 块级作用域
let为JavaScript新增了块级作用域
使用var是没有块作用域概念的
var a = '123'; if(true){
var a = '456';
} console.log(a); //
使用let就有了块作用域
let a = '123'; if(true){
let a = '456';
} console.log(a); //
外层的代码块不受内层代码块的影响
▓▓▓▓▓▓ 块级作用域和函数声明
ES5规定函数只能在顶层作用域和函数作用域中声明,不能在块作用域中声明
ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。
例如:
function f(){
console.log('out');
} (function(){ if(false){
function f(){
console.log('in')
};
}; f(); }());
在ES5中结果是 'in'。就是函数声明提升,不在多赘述
在ES6中,理想的结果是'out',但是在浏览器中运行时,却会报错,这是为什么?因为如果这么突兀,那么老的代码就会出现很多的问题,所以,ES6规定浏览器可以有自己的的行为方式
1、允许在块级作用域内声明函数。
2、函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
3、同时,函数声明还会提升到所在的块级作用域的头部。
注意,上面三条规则只对 ES6 的浏览器实现有效,其他环境的实现不用遵守,还是将块级作用域的函数声明当作let处理。
在ES6中实际执行的代码是
function f(){
console.log('out');
} (function(){ var f = undefined; if(false){
function f(){
console.log('in')
};
}; f(); }());
注意:ES6 的块级作用域允许声明函数的规则,只在使用大括号的情况下成立,如果没有使用大括号,就会报错。
// 不报错
'use strict';
if (true) {
function f() {}
} // 报错
'use strict';
if (true)
function f() {}
▓▓▓▓▓▓ const命令
const声明一个只读的常量,一旦声明,常量的值就不能改变。所以在使用const时,一旦声明就要立即初始化
const和let一样,只存在与本块作用域中,没有声明提升,存在暂时性死区,不可重复声明
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。
例如:
const a = {
id: 1,
name:'qqqq'
};
a.id = 2; a = {}; //报错
参考资料:
ECMAScript6-let和const命令的更多相关文章
- ECMAScript6 入门-let与const命令
块级作用域 1:let命令声明的变量只在let命令所在的代码块有效--简而言之 大括号既是代码块,也就是说存在块级作用域了. { let a =10; var b =1; } a // Referen ...
- ECMAScript6-let与const命令详解
前言 <ECMAScript入门>是一本开源的JavaScript语言教程,全面介绍ECMAScript6新引入的语法特性. let和const命令,是第一章开始介绍,也是比较基础的知识. ...
- es6学习笔记(1) let和const命令详解
let和const命令: Es6新增了let命令,声明变量,但与var不一样的,只在let命令所在的代码块内有效(如for循环之外let声明的变量就不再有效).并且let不像var那样会发生" ...
- let和const命令//////////////////////z
let和const命令 let命令 块级作用域 const命令 全局对象的属性 let命令 基本用法 ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的 ...
- ES6之let(理解闭包)和const命令
ES6之let(理解闭包)和const命令 最近做项目的过程中,使用到了ES6,因为之前很少接触,所以使用起来还不够熟悉.因此购买了阮一峰老师的ES6标准入门,在此感谢阮一峰老师的著作. 我们知道,E ...
- ECMAScript 6入门 - let和const命令
详细学习链接: http://es6.ruanyifeng.com/#docs/let let命令 基本用法 ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命 ...
- ES6 入门系列 - let 和 const 命令
let命令 基本用法 ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = ; ; } a // ReferenceEr ...
- ES6 之 let和const命令 Symbol Promise对象
ECMAScript 6入门 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了. (2016年6月,发布了小幅修订的<ECMASc ...
- let和const命令
let命令 1.let用来声明变量,类似于var,但只在代码块内有效. { let a = 1; var b = 2; } console.log(a); //a is not defined con ...
随机推荐
- c#入门系列——基础篇
c#与VB的区别 刚接触c#发现c#与vb还是有所不同的--它可以在控制台显示.它比vb多出来了一些东西.代码规范上跟VB也稍有不同.....暂时就发现这么多,正在努力发现中. c#的代码结构 ...
- Swift 2.0 UItableView 的简单使用
在IOS开发中,UItableView 的使用真的是最常见最普通的了,现在在自学swift 今天也是这用Swift 写了写 UItableview的使用,还有一些经常出错的地方.下面我先把整个控制器的 ...
- select中的文字垂直居中的问题
select文字在默认和边框高度增加时 是默认居中的.你要是不想居中的话可以用padding值调整.但是右侧的三角不会改变. select在高度减小时.字体是不会垂直居中的.无论你用什么他都不会垂直居 ...
- 使用批处理根据项目工程文件生成Nuget包并发布(支持.NET Core)
最近在使用之前自己编写的批处理给.NET Core项目打包时出问题了,发现之前的脚本根本不适用了,折腾了半天,总算解决了.因此在这里分享下经验,并且奉上整理好的脚本. Nuget包这里就不多介绍了,需 ...
- ESP8266使用详解--基于Lua脚本语言
这些天,,,,今天终于看到了希望,,,天道酬勤 先说实现的功能...让ESP8266连接无线网,然后让它建立服务器,,我的客户端连接上以后,发给客户端发数据模块打印到串口,,往ESP8266串口里发数 ...
- JS打开摄像头并截图上传
直入正题,JS打开摄像头并截图上传至后端的一个完整步骤 1. 打开摄像头主要用到getUserMedia方法,然后将获取到的媒体流置入video标签 2. 截取图片主要用到canvas绘图,使用dra ...
- C语言——选择排序
---恢复内容开始--- 算法思想: n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果: ①初始状态:无序区为R[1..n],有序区为空. ②第1趟排序 在无序区R[1..n]中选出 ...
- 第三章:初识Jquery
一.Jquery的优势 体积小,压缩后只有100KB左右 强大的选择器 出色的DOM封装 可靠的事件处理机制 出色的浏览器兼容性 使用隐式迭代简化编程 丰富的插件支持 二.Jquery语法 三.DOM ...
- 微软MSBI商业智能视频
第一讲:BI介质安装.BI基础知识讲解.BI方法论讲解.项目讲解 1.BI基础知识讲解.BI方法论实施2.微软BI的介绍(数据仓库介绍.SSIS介绍.SSAS介绍.SS ...
- MySQL Innodb 并发涉及参数
1 参数作用 MySQL的各个插件式引擎中,都会对事务及线程做一定的处理和优化.在Innodb引擎中,总是尝试保持 innodb内 操作系统的线程数(暂命名为innodb_thread) 应该小于或等 ...