1.let用法类似于var,但是let只在所在代码块有效

{
let a = 10;
var b = 1;
} a // ReferenceError: a is not defined.
b // 1

2.let适用于for循环

for (let i = 0; i < 10; i++) {
//...
} console.log(i) //ReferenceError: i is not defined

3.let 与 var 的区别

//***** let*****
var a = []
// 每一次循环,i都是新的变量,只在本轮循环有效
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i)
}
}
a[6](); // 6 //*****var*****
var a = []
// 变量i是var声明的,全局有效,每一次循环,i都会发生变化,里面所有的i都指向同一个i
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i)
}
}
a[6](); // 10

那么问题来了,使用let声明的i,在for循环条件中,每一次循环都是新的i,那么i如何记住上一次循环的值,来进行++,再到下一轮循环呢?答案是因为JavaScript引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。

4.for循环的父子作用域

for (let i = 0; i < 3; i++) {
let i = 'abc';
console.log (i)
} // abc
// abc
// abc

可以看出循环变量i与函数内部变量i不在同一作用域

5.“变量提升”概念

意思就是,一直以来var命令都会发生‘变量提升’的现象,意思就是变量可以在声明之前使用,输出的是“undefined”

6.let纠正了var的尴尬之处

// var 尴尬的地方,使用未声明的变量,竟然不报错
console.log(foo); //输出undefined
var foo = 2; // let纠正了var 的这一现象,使用未声明的变量,报错
console.log(bar); //输出ReferenceError
let bar = 2;

7.暂时性死区 (TDZ)

意思是,只要块级作用域{}存在let,用它来声明的变量,就不会受外部影响

var tmp = 123;

if (true) {
tmp = 'abc'; //ReferenceError
let tmp;// TDZ结束
console.log(tmp) // undefined
}

首先在{}中,存在let声明的tmp,那么tmp不受{}以外的变量影响,又因为在if里面的第一句使用到了tmp,这个东西又没有声明,看到总结的第5点就知道,它会报错。

所以,在let命令声明变量tmp之前,都属于变量tmp的死区!!

8.对死区使用 typeof 操作符

typeof x; // ReferenceError
let x; // 然而,对一个不存在的变量使用typeof,却不报错
type of undeclared_var // "undefined"

所以,在没有let之前,typeof运算符是百分之百安全的,永远不会报错

9.let不允许重复再相同作用域内,重复声明同一个变量

// 报错
function func () {
let a = 10;
var a = 1;
} // 报错
function func () {
let a = 10;
let a = 1;
} // 报错
function func (arg) {
let arg;
} // 不报错
function func (arg) {
{
let arg;
}
}

  

10. 使用let代替立即执行匿名函数

// 一般立即执行匿名函数是这样的
var config = (function() {
var config = []
config.push(1)
config.push(2)
config.push(3)
return config
}) // 使用let
let config;
{
config = []
config.push(1)
config.push(2)
config.push(3)
}

  

11.es6函数不被提升

一般使用‘use strict’开头,即严格模式,就是ES6

'use strict'
function a () {
console.log(1)
}
function f () {
a()
if (false) {
function a () {
console.log(2)
}
}
} f(); // 输出1

假如去掉严格模式语句,也就是老版本ES5状态下,是会输出2的,原因就是发生了函数的变量提升,即

function a () {
console.log(1)
}
function f () {
function a () { // function a() 被提升到最前面了,即使if语句不执行
console.log(2)
}
a()
if (false) {
function a () {
console.log(2)
}
}
} f(); // 输出2

12. const使用,物理内存地址不可更改

例如:

const a = {
name = 'guang'
};
a.name = 'lighter';
a.email = '123456789@qq.com'
console.log(a); // 输出为: { name : 'lighter', email : '123456789@qq.com' }

上面代码不会报错,这是为什么呢?因为这个const为复合型变量,变量名不知想数据,而是指向数据所在的地址。const命令知识保证变量名指向的地址不变,而不保证该地址的数据不变,所以将一个对象生命为常量必须非常小心

const的使用可以参照:http://www.cnblogs.com/zczhangcui/p/6393304.html

对于const常量,例如:const a = 13,因为13这个物理位置是不可变的,所有不能更改a指向的地址。

假如想测定不让修改const 对象,不管它是否复合型变量,都不允许更改

Object.freeze(a);
a.name = ' ' //报错
console.log(s)

 

------完------

1.let命令总结的更多相关文章

  1. Cmder--Windows下命令行利器

    cmder cmder是一个增强型命令行工具,不仅可以使用windows下的所有命令,更爽的是可以使用linux的命令,shell命令. 安装包 安装包链接 下载后,直接解压即用. 修改命令提示符λ为 ...

  2. 【每日一linux命令4】常用参数:

     下面所列的是常见的参数(选项)义: --help,-h                              显示帮助信息 --version,-V                        ...

  3. .NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门

    2016年6月27日.NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布,社区里涌现了很多文章,我也计划写个系列文章,原因是.NET Core的入门门槛相当高, ...

  4. MVVM模式解析和在WPF中的实现(三)命令绑定

    MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  5. SQLServer执行命令出现“目录无效的提示”

    异常处理汇总-数据库系列  http://www.cnblogs.com/dunitian/p/4522990.html 一般都是清理垃圾清理过头了,把不该删的目录删了 网上说法: 问题描述: 1.s ...

  6. SQLServer文件收缩-图形化+命令

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 收缩前 图形化演示: 不仅仅可以收缩日记文件,数据库文件也是可以收缩的,只不过日记收缩比 ...

  7. 让 windows 下的命令行程序 cmd.exe 用起来更顺手

    在 Windows 下使用 Larave 框架做开发,从 Composer 到 artisan 总是避免不了和 cmd.exe 打交道,系统默认的命令行界面却是不怎么好看,且每行显示的字符数是做了限制 ...

  8. [版本控制之道] Git 常用的命令总结(欢迎收藏备用)

    坚持每天学习,坚持每天复习,技术永远学不完,自己永远要前进 总结日常开发生产中常用的Git版本控制命令 ------------------------------main-------------- ...

  9. git 命令

    切换仓库地址: git remote set-url origin xxx.git切换分支:git checkout name撤销修改:git checkout -- file删除文件:git rm  ...

  10. svn 常用命令总结

    svn 命令篇 svn pget svn:ignore // 查看忽略项 svn commit -m "提交说明" // 提交修改 svn up(update) // 获取最新版本 ...

随机推荐

  1. function()

    avaScript中的function可以有以下两种用法:一是做“普通逻辑代码容器”,也就是我们通常意义上的函数.方法,和我们C/C++里的函数没什么大分别,只是写法稍有不同.用法更加灵活:二是做对象 ...

  2. 转 jquery获取两个标签之间文本

    https://blog.csdn.net/u010403387/article/details/44197629?utm_source=blogxgwz8 如以下代码所示,id为tidy的<a ...

  3. 20145232韩文浩《网络对抗》逆向及BOF基础实践

    实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShe ...

  4. robotframework 远程连接数据库问题

    今天在使用RF远程连接数据库时出现报错的问题,因为我发现只安装databaselibrary跟PyMsql的话,连接本地的数据库是OK的,但是如果我们的测试机性能有限,那么既要编写代码.运行测试.还有 ...

  5. linux和windows共享目录

    常用的samba共享 1.安装samba:可以先检查下是否已经安装:rpm -qa | grep samba,没安装直接yum,安装命令:yum install samba 2.创建共享文件夹 mkd ...

  6. 包建强的培训课程(14):Android与ReactNative

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...

  7. 「ZJOI2019」&「十二省联考 2019」题解索引

    「ZJOI2019」&「十二省联考 2019」题解索引 「ZJOI2019」 「ZJOI2019」线段树 「ZJOI2019」Minimax 搜索 「十二省联考 2019」 「十二省联考 20 ...

  8. 一个xss漏洞到内网漫游【送多年心血打造的大礼包啦!】

    i春秋作家:jasonx 原文来自:一个xss漏洞到内网漫游[送多年心血打造的大礼包啦!] 前言 渗透过程中,有时候遇某些网站,明明检测到有xss漏洞,但是盲打以后,收到的cookie还是不能登录后台 ...

  9. outline和outline-offset属性实现简单的缝边效果

    如果现在有个需求,让你实现下面的样式,你会怎么做呢? 我首先想到的是用 border + box-shadow 实现,代码如下 div { margin: 50px auto; width: 200p ...

  10. idea中如何将单个java类导出为jar包文件?

    idea作为一个java开发的便利IDE工具,个人是比较喜欢的,今天来探索个小功能:  导出单个类文件为jar包! 偶有这种需求,就是某个类文件独立存在,但是需要将其导出为jar,供别人临时使用,或者 ...