(译文)学习ES6非常棒的特性-深入研究var, let and const
Var
var firstVar; //firstVar被声明,它的默认值是undefined
var secondVar = 2; //secondVar被声明,被赋值2
先看一个例子:
var increment = 1;
if (increment === 1){
var increment; //重新声明
//Do something
}
console.log(increment); //这里会打印出什么?
声明提升
把所有的变量的声明都放到当前代码作用域的开头。
相当于这样:
var increment;
var increment;
increment = 1;
if (increment === 1){
...
}
console.log(increment); //print 1
在看一个例子:
var x = 0;
y = 1;
console.log(sumOf(x,y));
var y;
function sumOf(a, b){ return a + b; }
相当于这样:
var x;
var y;
function sumOf(a, b){ return a + b; }
x = 0;
y = 1;
console.log(sumOf(x,y));
声明提升只作用于声明,不作用于赋值,原来在哪一行赋值,还是原来的位置:
console.log(x);
x = 3;
var x = 1;
console.log(x);
将会打印:undefined, 1,而不是1, 3
执行上下文
代码执行的环境。
1 全局
2 函数
3 Eval函数内
注意代码块不是一个执行上下文。
function testMe(){
while(true){
var x = 2;
break;
}
console.log(x);
//仍然会打印出2
}
let
let是块作用域
function testMe(){
while(true){
let x = 2;
break;
}
console.log(x); //ReferenceError: x is not defined
}
1 这样的好处就是保证了变量不会被其他位置声明影响:
var x = 1;
{
let x = 3;
}
console.log(x); //仍然是1
2 可以不用闭包实现私有成员:
var Person;
{
let name;
Person = function(_name){
name = _name;
};
Person.prototype.getName = () => name;
}
var person = new Person('Maya');
console.log(name); //什么都不会打印
console.log(person.getName()); //Maya
3 声明提升不会作用域let
x = 5; //ok
y = 2; //ReferenceError: y is not defined
let y;
var x;
4 let声明的变量不会挂在window下面
var x = 5;
let y = 4;
console.log(this.x); //5
console.log(window.x); //5
console.log(this.y); //undefined
console.log(window.y); //undefined
5 重复声明会报错

const
有些数据需要存起来作为常量,比如模板,字符串等等。如何保证它们不会被修改呢?
const!const和let一样是块作用域,它有let的所有特性:
①声明的变量只在块作用域内能用
②没有变量声明提升
③声明的变量不会给window
④不能被重复声明
另外一点:
⑤它必须初始化的时候就被赋值
const myConstants; //SyntaxError: Missing initializer in const declaration
⑥只能被赋值一次。
注意一点的是,如果const声明的是对象、数组的话,仍然可以修改:
const myConstant = {name: "Constant"};
myConstant = {name: "new Constant"}; //Error 不能被重新赋值
myConstant.name = "new Constant"; //OK 可以被修改
console.log(myConstant.name); //new Constant
const arr = [1, 2];
arr = [2,3]; //Error
arr[0] = 2; //OK
console.log(arr); //[2,2]
let和const的好处
1 避免污染全局window
2 避免隐藏错误:比如修改常量,错误的更新了变量的值等等
3 避免了不必要的变量提升
4 让代码更加可靠,更易组织,更易读。
原文:
https://medium.com/front-end-hacking/es6-cool-stuffs-var-let-and-const-in-depth-24512e593268
作者知乎/公众号:前端疯
(译文)学习ES6非常棒的特性-深入研究var, let and const的更多相关文章
- (译文)学习ES6非常棒的特性——Async / Await函数
try/catch 在使用Async/Await前,我们可能这样写: const main = (paramsA, paramsB, paramsC, done) => { funcA(para ...
- (译文)学习ES6非常棒的特性-字符串常量基础
字符串常量基础 在ES2015之前我们是这么拼接字符串的: var result = 10; var prefix = "the first double digit number I le ...
- ES6非常棒的特性-解构
https://blog.csdn.net/maoxunxing/article/details/79772946
- 用简单的方法学习ES6
ES6 简要概览 这里是ES6 简要概览.本文大量参考了ES6特性代码仓库,请允许我感谢其作者@Luke Hoban的卓越贡献,也感谢@Axel Rauschmayer所作的[优秀书籍]//explo ...
- ES6的一些常用特性
由于公司的前端业务全部基于ES6开发,于是给自己开个小灶补补ES6的一些常用特性.原来打算花两天学习ES6的,结果花了3天才勉强过了一遍阮老师的ES6标准入门(水好深,ES6没学好ES7又来了...) ...
- 【系统学习ES6】新专题发布
我要发免费专题了,向下看 公众号和博客都有一阵没更新了,丢了一些粉儿,但是也很庆幸,时时还会有人关注.我并不是什么专业讲师,文章都是利用业余时间手工原创.在这里非常感谢各位的支持和厚爱. 这个月开始, ...
- 用vue.js学习es6(一):基本工具及配置
一.工具: sublime,node.js,npm 1.安装sublime 的es6插件: (1).在sublime中按Ctrl+`调出console (2).粘贴以下代码到底部命令行并回车(subl ...
- 学习ES6生成器(Generator)
背景 在JS的使用场景中,异步操作的处理是一个不可回避的问题,如果不做任何抽象.组织,只是“跟着感觉走”,那么面对“按顺序发起3个ajax请求”的需求,很容易就能写出如下代码(假设已引入jQuery) ...
- 你是否也在学习ES6 Promise时遇到过这个问题?
背景 周末闲来无事,随便翻看了一下阮一峰老师的<ES6 标准入门>第2版,ps:之前在阮一峰老师的官网看过电子版,感觉干货满满,所以就买了纸质版:当看到第16章第4节 'Promise.p ...
随机推荐
- angular自定义过滤器操作实例
//模块名字var filters = angular.module("customFilter",[]);//过滤器名字filters.filter("uniqueCa ...
- 异常-----Java compiler level does not match解决方法
1, 先设置好jdk,需要确定 项目,eclipse/myeclipse,系统 用的是同一个版本的JDK,我系统中安装的JDK是1.7,所以我把eclipse的jdk成1.7 2, 进入 window ...
- [HAOI2008]木棍分割
题目大意 网址:https://daniu.luogu.org/problemnew/show/P2511 题目大意: 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连 ...
- [BZOJ3223] [Tyvj1729] 文艺平衡树 (splay)
Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 ...
- js中url跳转问题
问题描述:列表中有不同的企业名字,每个企业名字都有一个不同的链接,用id做为参数区分.点击不同的名字,根据id的不同跳转到对应的详情页,设置连接如下: 1. url = http://localhos ...
- python迭代和切片
from collections import Iterable #切片************************ # #取一个list或tuple的部分元素是非常常见的操作 ,Python提供 ...
- Android 开发使用第三方库出现Crash时处理方案汇总
一.Glide混淆脚本没加导致的Crash 现象描述: 使用Glide开发的时候在debug版本一直没事,但是realease版本各种Crash,报错信息如下: java.lang.IllegalAr ...
- Lintcode245 Subtree solution 题解
[题目描述] You have two every large binary trees:T1, with millions of nodes, and T2, with hundreds of no ...
- Spring Mobile——探测客户端设备和系统
Spring Mobile--探测客户端设备和系统 今天闲来无事,浏览Spring的官方网站,发现了Spring Mobile项目,之前也看到过,还以为是针对手机端的项目,并没有细看.今天仔细看了一下 ...
- Javascript 基础知识2017-03-17
JavaScript语法 1.单行注释:// 多行注释:*/ 2.基本数据类型: int 整数型 (不等于四舍五入,把小数舍去) string 字符型 ...