let命令和块级作用域
学习了阮一峰老师的ES6,http://es6.ruanyifeng.com/,收益良多。
一、let命令
1、概念:let命令用于声明变量,和var类似,但是使用let命令所声明的变量只有在该变量所在的代码块内生效。
2、使用:适用于for循环的变量声明。
for (let i = 0;i < 10;i++) {
let i = "a";
}
// for循环里面的两个i是不同的,并且属于不同的作用域。第一个i属于是for循环的循环变量的父作用域,第二个i属于是for循环的循环体的一个单独的子作用域。
console.log(i); // ReferenceError: i is not defined
3、与ES5的区别:
(1)ES6中的let命令不存在变量提升的问题。ES5中变量可以在声明之前使用,值为undefined。
// ES5:
console.log(example); // undefined
var example = "hello world"; // ES6:
console.log(example); // ReferenceError: example is not defined
let example = "hello world";
(2)暂时性死区。在代码块中,使用let命令所声明的变量在声明之前都是不可用的。在语法上,称为“暂时性死区”(temporal dead zone)TDZ。
{
// 死区开始 -> 代码块的开始
console.log(temp);
let temp = ""; // 死区结束 -> 使用let变量声明了temp
}
(3)不允许重复声明。
function fun1() {
let a = "1";
var a = "2";
}
fun1(); // Identifier 'a' has already been declared
function fun2() {
let a = "1";
let a = "2";
}
fun2(); // Identifier 'a' has already been declared
二、块级作用域
1、为什么需要块级作用域?
(1)内层变量可能会覆盖外层变量。
(2)用来计数的循环变量泄露为全局变量。
var date = new Date();
function f() {
console.log(date);
if (false) {
var date = "hello world";
}
}
// if代码块的外部使用内层的date变量,内部使用内层的date变量。但是,函数f执行后,输出结果为undefined,原因在于变量提升,导致内层的date变量覆盖了外层的date变量。
f(); // undefined
// 用来计数的循环变量泄露为全局变量
var str = 'hello world';
for (var i = 0;i < str.length;i++) {
// ...
}
// console.log(i); // 5
let命令和块级作用域的更多相关文章
- ECMAScript6 入门教程 初学记录let命令 块级作用域
一.基本语法-let命令 (1)ES6新增了let命令,用来声明变量.所声明的变量,只在let命令所在的代码块内有效. 循环的计数器,就很合适使用let命令.计数器i只在for循环体内有效,在循环体外 ...
- ES6标准入门 第二章:块级作用域 以及 let和const命令
一.块级作用域 1.为什么需要块级作用域? ES5中只有全局作用域和函数作用域,带来很多不合理的场景. (1)内层变量可能会覆盖外层变量: var tem = new Date(); function ...
- ES6(块级作用域)
我们都知道在javascript里是没有块级作用域的,而ES6添加了块级作用域,块级作用域能带来什么好处呢?为什么会添加这个功能呢?那就得了解ES5没有块级作用域时出现了哪些问题. ES5在没有块级作 ...
- ES6之块级作用域
一.前言 在ECMAScript6(以下简称ES6)之前,ECMAScript的作用域只有两种: 1. 全局作用域: 2. 函数作用域. 正是因为有这两种作用域,所以在JavaScript中出现一 ...
- ES6 - Note1:块级作用域与常量
在ES6以前,ES不支持块级作用域,只有全局作用域和函数作用域,所有变量的声明都存在变量声明提升. 1.let 关键字 声明一个块级变量,只在一个代码块中有效,如果在块外面访问便会报错,如下所示: { ...
- ES6 浅谈let与const 块级作用域之封闭空间(闭包)
ES6新增了 let const 命令,用来声明变量.它的用法类似于 var ,但是所声明的变量,只在 let const 命令所在的代码块内有效. var const 不允许重复声明 用处: 可 ...
- ES6的 let const 以及块级作用域
let声明变量 用法类似于var,但是所声明的变量只在let所在的代码块内有效. 1 . 在ES6环境下,let声明的变量不能在声明之前调用. 例: console.log(i); //会报错,这叫做 ...
- ES6-let、const和块级作用域
1.介绍 总的来说,ES6是在ES2015的基础上改变了一些书写方式,开放了更多API,这样做的目的最终还是为了贴合实际开发的需要.如果说一门编程语言的诞生是天才的构思和实现,那它的发展无疑就是不断填 ...
- 闭包和let块级作用域
还是先从一个题目开始: 写一个隔1s输出数组的一项的函数. 如果可以用ES6语法,则可以这么写: function print (arr) { for (let i = 0; i < arr.l ...
随机推荐
- February 2nd, 2018 Week 5th Friday
Reputation takes a life time to build and a second to destroy. 树立名声需要一生的努力,而毁掉它只需要一秒. To be a smart ...
- Visual Studio 2015的安装与测试单元的配置与使用
首先感谢吴小勇同学的教程,及其详尽周全.详见http://www.cnblogs.com/xiaoyongwu/p/5289964.html 那么正式开始,事实上在撰写这篇博文的时候,这个图标 ...
- Web服务器的反向代理nginx
nginx作为web服务器一个重要的功能就是反向代理. Nginx配置详解 序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的.从2004年发布至今,凭 ...
- 使用 React-Sketchapp 管理你的设计资产
首发:https://www.yuque.com/jingwhale/blog/do37mc 最近在整理设计规范的过程中,尝试使用了 Airbnb 公司发布的 react-sketchapp 工具.从 ...
- HTML元素 - input type=hidden
定义 传输关于客户/服务器交互的状态信息. Transmits state information about client/server interaction. 注释 这种输入类型用户无法控制,但 ...
- django 中的 ajax
(Asynchronous Javascript And XML ) 特点: 异步 页面局部刷新 传递的数据量小 ajax 请求返回数据 重定向 location.href='/index/' 发请求 ...
- cpu的控制单元与语言中的控制逻辑有没有关系?
cpu的控制单元与语言中的控制逻辑有没有关系?
- LOOPS HDU - 3853 (概率dp):(希望通过该文章梳理自己的式子推导)
题意:就是让你从(1,1)走到(r, c)而且每走一格要花2的能量,有三种走法:1,停住.2,向下走一格.3,向右走一格.问在一个网格中所花的期望值. 首先:先把推导动态规划的基本步骤给出来. · 1 ...
- 转载 .Net多线程编程—任务Task https://www.cnblogs.com/hdwgxz/p/6258014.html
.Net多线程编程—任务Task 1 System.Threading.Tasks.Task简介 一个Task表示一个异步操作,Task的创建和执行是独立的. 只读属性: 返回值 名称 说明 ob ...
- Reflections - Java 8 - invalid constant type
异常说明 使用Reflections扫描的时候出现could not create class file from, 原因是invalid constant type: 18 异常堆栈: org.re ...