【系统学习ES6】

本专题旨在对ES6的常用技术点进行系统性梳理,帮助大家对其有更好的掌握。计划每周更新1-2篇,希望大家有所收获。

以前用ES5时,声明变量只能用varES6的出现,为我们带来了两种新的声明方式:letconst。我们可以先简单记忆:

  • var:声明全局变量

  • let:声明局部变量

  • const:声明常量

var声明

varES6里是用来声明全局变量的,我们先看一个简单的例子:

var a = "lemoncool";
console.log(a);

控制台输出了“lemoncool”。但这个例子不足以声明a是全局变量。我们继续声明一个函数,在函数体中看是否可以拿到函数外面声明的a

var a = "lemoncool";
var testFun = function(){
 console.log(a);

testFun();

控制台同样输出了“lemoncool”,说明函数中可以拿到外部声明的a,这可以说明var声明的变量确实是全局的。如果你觉得这个例子说服力还不够,那我们继续看。

var a = "lemoncool";
var testFun = function(){
  a = '23';

testFun(); 
console.log(a);

此时控制台会输出多少呢?是"23"。我想,这个例子,足以说明var是全局声明的。

let 声明

我们试着用let再次执行上面的例子:

var b = "lemoncool";
var testFun = function(){
  let b = '23';

testFun(); 
console.log(b);

函数执行后,再打印b,你觉得会输出多少呢?结果是此时输出的是"lemoncool"。为什么?

因为我们在函数里用通过let声明了 b,这时的 b ="23"只在函数作用域内有效,属于局部变量。外面的打印,拿不到函数的局部变量,所以拿不到"23"。

那如果我们只在函数体里声明b,外部的声明删掉,打印就会输出"23"么?

var testFun = function(){
  let b = '23';

testFun(); 
console.log(b);

不好意思,报错了。不在外部声明,即使函数里声明再多花样,外部依然拿不到。

上面两个例子,说明了let声明的是局部变量。let声明的变量,只在区块内起作用,外部拿不到,也是不可以调用的。有关作用域问题,大家可以自行查阅资料深入了解。

所以let不会存在变量提升的bug,可以有效防止数据污染。同时,let不允许在相同作用域内,重复声明同一个变量。

在合理场景下,我们要努力去习惯用let代替var

const 声明

在开发中,有些变量从声明后就不允许改变。这种变量叫常量。这时就需要用到const声明。

我们通过一个反例,看一段错误代码:

const c = "lemoncool";
c = 'hello';
console.log(c);

执行这段代码时,会报错。原因是const声明的变量不可改变。

const c = "lemoncool";
console.log(c); //"lemoncool"
const d; // SyntaxError: Missing initializer in const declaration

这段代码同样会报错, 意味着,const一旦声明必须初始化,否则会报错。

 Qconst声明的变量初始化不允许再改变,是针对所有类型么?

A:答案是“”,简单类型(数值 number、字符串 string 、布尔值 boolean),的确是这样。但是对于复杂类型(对象 object,数组 array,函数 function),const只能保证变量指针是固定的,至于指针指向的数据结构,是否发生变化,就有些无法控制。所以使用 const 声明复杂类型对象时要慎重。

暂时性死区

var temp = "lemoncool";
if (true) {
 console.log(temp);
 const temp = '123456';
}

你以为会输出“lemoncool”?NO,会报错。

ES6 明确规定,代码块内如果存在 let 或者 const,代码块会对这些命令声明的变量从块的开始就形成一个封闭作用域。 凡是在声明之前就使用这些变量,就会报错。

所以,在代码块内,使用letconst命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。

上面代码中,在const命令声明变量temp之前,都属于变量temp的“死区”。

到此,三种声明方式的使用方法及注意事项已梳理完毕。没有整理很细,因为细的知识点太多,不知从何说起。大家作为一个大纲,举一反三。

下一节我们会一起讨论【解构赋值】,感谢大家支持,希望大家在每一节中都有所得。

 公棕号【前端便利贴】记录着一个程序媛的所见所得所想,分享日常技术笔记,内容覆盖了阅读、技术和个人思考~,关注公棕号更早获取更多文章。

觉得有用的话,小手点点【推荐】再走吖~~

【系统学习ES6】第一节:新的声明方式的更多相关文章

  1. 【系统学习ES6】第二节:解构赋值

    [系统学习ES6] 本专题旨在对ES6的常用技术点进行系统性梳理,帮助大家对其有更好的掌握,希望大家有所收获. ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构.解构是一种打 ...

  2. 【系统学习ES6】新专题发布

    我要发免费专题了,向下看 公众号和博客都有一阵没更新了,丢了一些粉儿,但是也很庆幸,时时还会有人关注.我并不是什么专业讲师,文章都是利用业余时间手工原创.在这里非常感谢各位的支持和厚爱. 这个月开始, ...

  3. ES6第二节:新的声明方式

    通过上一节的环境搭建完成,接下来我们就可以愉快的探索ES6的新世界了!下面我们从新的声明方式开始: 在ES6里新加了两种声明方式:let 和 const,以前我们都是用var去作声明,接下来我们一一比 ...

  4. 学习HTML 第一节.小试牛刀

    此贴并非教学,主要是自学笔记,所述内容只是些许个人学习心得的记录和备查积累,难以保证观点正确,也不一定能坚持完成. 如不幸到访,可能耽误您的时间,也难及时回复,贴主先此致歉.如偶有所得,相逢有缘,幸甚 ...

  5. 二.ES6新的声明方式

    前言: 以前我们在声明时只有一种方法,就是使用var来进行声明,ES6对声明的进行了扩展,现在可以有三种声明方式了. 字面理解ES6的三种声明方式: var:它是variable的简写,可以理解成变量 ...

  6. ES6系列_2之新的声明方式

    在ES5中我们在声明时只有一种方法,就是使用var来进行声明,ES6对声明的进行了扩展,现在可以有三种声明方式. (1)var:它是variable的简写,可以理解成变量的意思. (2)let:它在英 ...

  7. Vue快速学习_第一节

    之前写CRM都是Django前后端一起写的,在大部分项目中实际上前后端是分离的,因此我们需要学习一个前端框架来进行前端页面的编写,这里选择了Vue进行学习,好了开始学习吧. 1.ES6部分知识点学习 ...

  8. python3网络爬虫系统学习:第一讲 基本库urllib

    在python3中爬虫常用基本库为urllib以及requests 本文主要描述urllib的相关内容 urllib包含四个模块:requests——模拟发送请求 error——异常处理模块 pars ...

  9. [struts2学习笔记] 第一节 关于struts2的简单认知

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/40298287 官方文档:http://struts.apache.org/releas ...

随机推荐

  1. 1、java语言概述

    Java基础知识图解 软件开发 软件开发 软件,即一系列按照特定顺序组织的计算机数据和指令的集合.有系统软件和应用软件之分. 人机交互方式 图形化界面(Graphical User Interface ...

  2. 为什么有些公司的IT很乱?

    --别问,问就是赛马,问就是KPI驱动 为什么很多公司甚至是闻名遐迩的资深IT公司,都被吐槽IT技术建设很烂呢?按惯例,问为什么之前,先问是不是. ▒壹·鹅厂▒ 2018年一个名为"当下腾讯 ...

  3. 【模板】O(nlongn)求LIS

    合理运用单调性降低复杂度 平常用的都是O(n^2)的dp求LIS(最长不下降子序列)这里介绍O(nlogn)的算法 分析 对于可能出现的x<y<i且A[y]<A[x]<A[i] ...

  4. NOIP模拟测试38「金·斯诺·赤」

    金 辗转相减见祖宗 高精 #include<bits/stdc++.h> using namespace std; #define A 2000 #define P 1 #define N ...

  5. .NET Core/.NET5/.NET6 开源项目汇总8:Blazor项目

    系列目录     [已更新最新开发文章,点击查看详细] Blazor 是一个使用 .NET 生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建信息丰富的交互式 U ...

  6. c#创建windows服务(创建,安装,删除)

    一.在vs中创建一个window服务 二.进入Service1.cs页面后 右击----创建安装程序,安装程序创建成功后---会出现ProjectInstaller.cs文件 三.进入ProjectI ...

  7. npm i安装命令中的-g -D -S的区别

    -g为全局安装 -D 对模块进行局部安装,模块写入到 devDependencies 对象 用于开发阶段,开发时用到的工具等 -S 局部安装,不同的是模块写入到 dependencies对象 用于生产 ...

  8. 给STM32MP157C-DK2烧录固件

    环境: 一台PC(window/linux) STM32CubeProgrammer 我下载到的是 2.1 版本(19\07\10下载的) 里面的文件是: 里面有 3 个文件,分别window.Lin ...

  9. 07 修改JumpServer网页信息

    1.7.修改JumpServer网页信息 注意:在修改相关配置文件之前要先进行备份,防止文件修改错误无法恢复. 1.Luna图标: /opt/luna/static/imgs/logo.png 2.j ...

  10. 移动端touch、click、tap的区别

    一.click 与tap比较 click与tap都会出发点击事件,但是在手机web端,click会有200-300ms延迟,所以一般用tap(轻击)代替click作为点击事件.singleTap 和 ...