ES6学习笔记(1)----let和const命令
参考书《ECMAScript 6入门》
http://es6.ruanyifeng.com/
let和const命令
let 总结
1.声明变量基本使用方法与var 相同
不同点
a.在代码块中使用let声明的变量只在代码块中有效,代码块外无法访问,而用var声明的在代码块外也可以访问。可以利用这点声明局部变量,也可用它解决js中的for循环闭包的问题
****闭包的解释****
function out(){//外部函数
var arr = [];
for(var i = 0; i < 3; i ++){
arr[i] = function(){//匿名函数
console.log(i);
}
}
return arr;
}
out()[0]();
期待结果 0
实际结果 2
造成结果偏差的原因就是闭包
闭包的定义:有权访问另一个函数作用域中的变量的函数
在此例子中,函数out内部创建了另外一个匿名函数,并且这个匿名函数可以访问out的变量i,这就形成了闭包(实现了匿名函数有权访问out的作用域中的变量)
解决闭包的方法
M1.匿名函数自执行传参
function out(){//外部函数
var arr = [];
for(var i = 0; i < 3; i ++){
arr[i] = (function(number){//匿名函数
console.log(number);
})(i);
//使用()()利用匿名函数自执行的方式将参数传递给匿名函数使用
//这里每循环执行一次i,i就会作为参数进行匿名函数自执行,然后最终结果就是0,1,2
}
return arr;
}
out();//0,1,2
M2.将参数传给匿名函数的变量
function out(){//外部函数
var arr = [];
for(var i = 0; i < 3; i ++){
arr[i] = function(number){//匿名函数
console.log(number);
}(i)//和(function(){})()是一个意思,都是告诉浏览器自动运行这个匿名函数,这时将参数传给匿名函数的参数,可以不用加()
}
return arr;
}
out();//0,1,2
M3.let 定义块级作用域变量的方式
function out(){//外部函数
var arr = [];
for(let i = 0; i < 3; i ++){
arr[i] = function(){//匿名函数
console.log(i);
}
}//let声明的变量是块级作用域变量,每次循环都生成一个新的变量i,所以console.log(i) 也只能返回for循环内部的每次i,无法像var 定义的一样返回访问全局的i
return arr;
}
out()[0]();//0
b. let 不支持变量提升
console.log(a); //会报ReferenceError错误,表示不存在这个变量。在代码块中,使用let/const声明变量前,变量都是不可用的,称为“暂时性死区”
a = 23;//ReferenceError
typeof a;//ReferenceError
let c = c;//ReferenceError c还没有完成变量声明,不可以用来赋值
function test(x = y,y = 2){return x+y};//ReferenceError: y is not defined 在给x赋值y时,y还没有声明
//暂时性死区本质:在块级作用域里,变量只有等到声明变量的那一行代码出现时,才可以赋值和使用,不然都会报错
let a = 9;
console.log(b);//undefined 当用var声明变量时,浏览器运行时会先声明这个变量b,但是b没有赋值,就输出undfined
var b = 9;
c.let不支持重复声明变量
funtion test(){var a = 1;var a = 2;}
test();//不报错 undefined
funtion test(){let a = 1;var a = 2;}
test();//报错 Uncaught SyntaxError: Identifier 'c' has already been declared
funtion test(){var a = 1;let a = 2;}
test();//报错 Uncaught SyntaxError: Identifier 'c' has already been declared
funtion test(){let a = 1;let a = 2;}
test();//报错 Uncaught SyntaxError: Identifier 'c' has already been declared
function action(event){let event = event || window.event}
action();//Uncaught SyntaxError: Identifier 'event' has already been declared
function action(event){var event = event || window.event}
action();//不报错
2. let命令声明了js的块级作用域
var a = 1;
function test(){
console.log(a);//undefined 此处发生了变量提升,这里的a指的是if中的那个a
if(true){
var a = 3;
}
console.log(a);//3 此处的a是if中重新声明赋值的a
}
let b = 1;
function test(){
console.log(b);//1 第一个let作用域内的b
if(true){
let b = 3;
}
console.log(b);//1 第一个let作用域内的b
}
立即执行函数等同于let块级作用域
(function(){var c = ..........;}())------------{ let c = ......;}
es6可以在块级代码中声明函数
if(true){
function test(){}//函数声明语句
}
if(true){
let c = function(){}//函数表达式
}
const 总结
1.声明常量,声明的同时就要赋值,且不允许再被改变
const NATURE = 3//ok
const NATURE1;//报错Uncaught SyntaxError: Missing initializer in const declaration,必须声明的同时赋值
2.块级作用域,不支持变量提升,暂时性死区,同一作用域内不允许重复声明变量与let一致
const obj = {}
obj.name = '123'//ok 给对象增加属性属于对象obj的功能
obj = {"name" : "123"};//报错 常量obj不可以重新赋值
小结:ES6是ES5的升级版
ES5有两种声明变量的方法:var,function
ES6有六种声明变量的方法:var,function,let,const,import,class
ES6学习笔记(1)----let和const命令的更多相关文章
- es6学习笔记1 --let以及const
let语句的基本用法: 1.let声明的变量为块级作用域,只在最近的{}里面有效,如果在外部引用就会报错. { let a = 10; var b = "hello" } ale ...
- ES6学习笔记(一)——let和const
1.ES6学习之let.const (1).var.let.const 变(常)量声明 ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景. 在ES6中let就诞生了,实际上它 ...
- ES6学习笔记之 let与const
在js中,定义变量时要使用var操作符,但是var有许多的缺点,如:一个变量可以重复声明.没有块级作用域.不能限制修改等. //缺点1:变量可以重复声明 var a=1; var a=2; conso ...
- ES6学习笔记<一> let const class extends super
学习参考地址1 学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...
- ES6 学习笔记(一)let、const与作用域
一.let命令 1.1用法 1.1.1 let类似于var,但所声明的变量只在let命令所在的代码块有效. 如: { let a = 10 var b = 20 } console.log(b) co ...
- es6学习笔记-class之一概念
前段时间复习了面向对象这一部分,其中提到在es6之前,Javasript是没有类的概念的,只从es6之后出现了类的概念和继承.于是乎,花时间学习一下class. 简介 JavaScript 语言中,生 ...
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
- JS&ES6学习笔记(持续更新)
ES6学习笔记(2019.7.29) 目录 ES6学习笔记(2019.7.29) let和const let let 基本用法 let 不存在变量提升 暂时性死区 不允许重复声明 块级作用域 级作用域 ...
- ES6学习笔记<四> default、rest、Multi-line Strings
default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...
随机推荐
- 深度学习笔记之基于R-CNN的物体检测
不多说,直接上干货! 基于R-CNN的物体检测 原文地址:http://blog.csdn.net/hjimce/article/details/50187029 作者:hjimce 一.相关理论 本 ...
- 【java】itoo项目实战之hibernate 懒载入优化性能
在做itoo 3.0 的时候,考评系统想要上线,就開始导入数据了,仅仅导入学生2万条数据,可是导入的速度特别的慢.这个慢的原因是由于导入的时候进行了过多的IO操作.可是导入成功之后,查询学生的速度更加 ...
- 对于api安全性的思考
目前的情况下api被很多地方应用,随之而来的是api的安全性问题. 我所认识到的安全性问题有以下几个方面: 1.DDoS(拒绝服务攻击),接口被恶意调用,使真实的用户无法享受到正常畅通的服务. ...
- HDU 5302(Connect the Graph- 构造)
Connect the Graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- java8--网络编程(java疯狂讲义3复习笔记)
重点复习一下网络通信和代理 java的网络通信很简单,服务器端通过ServerSocket建立监听,客户端通过Socket连接到指定服务器后,通信双方就可以通过IO流进行通信. 需要重点看的工具类:I ...
- JS之RegExp对象(二)
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zkn_CS_DN_2013/article/details/24243159 RegExp对象的经常 ...
- linux内存管理之uboot第一步
在进入讲解linux内存管理的kernel阶段以前,了解一下uboot阶段是如何准备好内存物理设备的,这是非常有意义的.通常进入到linux内核阶段之后,对内存芯片的物理特性寄存器访问是比较少的,强调 ...
- jquery中跳出each循环
or循环 VS jquery.each continue return true break return false
- 13_传智播客iOS视频教程_OC程序的编译链接
C程序的编译.链接.执行怎么来的?在.C文件里面写上符合C语言部分的源代码.OC也是一样的.记住:OC程序的后缀名是.m. 为什么要链接?第一个.o的目标文件里面它启动不了.因为它没有启动代码我们要加 ...
- hdu4815 概率问题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4815 好久没写dp了..最开始题意都理解错了, 哎!!我现在很饿也很困!! AC代码: #includ ...