Babel 转码器

Babel是广泛使用的一个ES6转换器,将ES6代码转换成ES5代码,从而实现在老版本的浏览器执行。

let和const命令

let所声明的变量只在let命令所在的代码块内是有效的。

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

通过let给出了变量的作用域问题,在我们通常的for循环使用比较方便

        var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
} for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6]()
//当用var声明变量的时候,发现,在输出框内,输出的值是10,也是就说var定义的i是全局的变量,
//所以在全局内只有一个i,当后续的值不断写入之后,不断地覆盖之前的值
//如果使用let定义变量的话,由于作用域是在块级,也就是说,每一次循环都是一个新的变量,所以我们可以输出6

变量提升

在用var定义变量时,我们可以在声明之前就使用变量,值为underfined,也就是变量提升

在使用let定义变量时,如果变量没有定义或者说,在变量定义之前就使用变量的话,会报错Uncaught ReferenceError的

        console.log(a);     //undefined
var a = 10; console.log(b); //Uncaught ReferenceError
let b = 5;

暂时性死区

只要块级作用域存在let命令,所声明的变量就绑定了这个区域,不再受外部的影响。

var tmp = 123;

if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}

报错!也就是首先存在全局变量tmp,在块级作用域中,对tmp的赋值在声明变量之前,导致let声明的tmp绑定了这个块级作用域

ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。

凡是在声明之前就使用这些变量,就会报错。

在let声明变量之前都是不可以使用的,在语法称作暂时性死区

var tmp = 123;
if (true) {
let tmp;
tmp = 'abc';
console.log(tmp); //abc
}
console.log(tmp); //123

在这种情况下对变量首先进行声明,在之后的使用中也就不会报错了。

if (true) {
// TDZ开始
tmp = 'abc'; // ReferenceError
console.log(tmp); // ReferenceError let tmp; // TDZ结束。在let声明之前,tmp都是属于死区
console.log(tmp); // undefined tmp = 123;
console.log(tmp); // 123
}

“暂时性死区”也意味着typeof不再是一个百分之百安全的操作。在使用typeof的时候报ReferenceError错误,但是没有声明的变量报underfined错误

function bar(x = y, y = 2) {
return [x, y];
} bar(); // 报错,在将y赋值给x的时候,y是没有被声明的,同样在使用let x=x 的时候,也是会报错的,将x赋值给x,但是后面的x并没有被定义

不允许重复声明

let不允许在相同的作用域内,重复声明同一个变量

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

同时,在函数内部重新声明参数也是不可以的

function func(arg) {
let arg;
}
func() // 报错 function func(arg) {
{
let arg;
}
}
func() // 不报错

块级作用域

在ES5中,只有全局作用域和函数作用域,没有块级作用域

块级作用域实现了块级作用域之间的一个嵌套,每一个块级对应都是他的一个作用域,内外层的变量就可以不受影响

块级作用域和函数声明

在ES5中,函数只能在顶层作用域和函数作用域中声明,不能在块级作用域中声明,但是浏览器没有遵循这个规定,也就是说,在浏览器中是不会报错的

在ES6中,块级作用域必须要有大括号,否则mJavaScript引擎就认为不存在块级作用域。

const命令

const声明一个只读的常量。一旦声明,常量的值就不能改变。

const PI = 3.1415;
PI // 3.1415 PI = 3;
// TypeError: Assignment to constant variable.

只声明不在赋值会报错

const foo;
// SyntaxError: Missing initializer in const declaration

const的作用域与let命令相同:只在声明所在的块级作用域内有效。

if (true) {
const MAX = 5;
} MAX // Uncaught ReferenceError: MAX is not defined

const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。

对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。

关于ES6的let、const那些事儿的更多相关文章

  1. (1)ES6中let,const,对象冻结,跨模块常量,新增的全局对象介绍

    1.let声明变量,var声明变量,而const声明的常量 2.let与var的区别 let可以让变量长期驻扎在内存当作 let的作用域是分块[ {快1  {快2 }  }每个大括号表示一个独立的块 ...

  2. ES6 let和const详解及使用细节

    ES6之前javascript只有全局作用域和函数作用域,所以经常会遇到变量提升了或者使用闭包的时候出错的问题. 所有a[i]都会输出10: var arr=[]; for (var i=0;i< ...

  3. ES6 let和const命令(3)

    const 用来声明常量.一旦声明,就不能改变. const在声明必须初始化,只声明不赋值会出错 const的作用域与let一样,只在声明的块级作用域有效. const命令声明的常量也不提升,同样存在 ...

  4. es6 let和const命令(1)

    基本用法 ES新增了let命令,用于声明变量.其用法类似于var,但是所声明的变量只在let命令所在的代码块中有效. for(let i = 0;i<5;i++) {} console.log( ...

  5. JavaScript ES6 let、const

    在ES6中,增加了2个声明变量的关键字:let 和 const.在这里将详细介绍let与var的区别.Babel对let的处理以及const的简单使用. 1. let 在ES6规范中增加了 let 关 ...

  6. es6 let 和 const

    function test(){ let a = 1 for (let i =0;i<3;i++){ console.log(i)         //1,2 } console.log(i)  ...

  7. ES6的 let const 以及块级作用域

    let声明变量 用法类似于var,但是所声明的变量只在let所在的代码块内有效. 1 . 在ES6环境下,let声明的变量不能在声明之前调用. 例: console.log(i); //会报错,这叫做 ...

  8. es6的let,const

    1.es6 新增的let const 命令 let用来定义一个局部变量,故名思意就是只在当前代码块可用 1.1 let 声明的变量不存在变量提升(var 声明的变量存在变量提升)且代码块内 暂时性死区 ...

  9. es6 let和const

    一.let 1.let块作用域 if(true){ var a=1; let b=2; } console.log("a:"+a);//a:1 console.log(" ...

随机推荐

  1. JS 与 jQery 的区别主要在于 DOM

    //目前正在学习前端阶段,把知识点整理.保存下来以便日后查看 首先引入jQery: 需要先引入css,再引入js: jQery需要在js前引入,再引入框架,最后才是js的引入:css也相同,先引入框架 ...

  2. odoo12 Tree视图创建编辑旁边新增按钮,并根据条件隐藏

    前言 我们通常在form视图中可以很简单地在header里面添加按钮,但是在某些情况下,我们也需要在Tree视图中添加按钮,但是odoo官方目前没有给我们提供相应的接口,因此,我们尝试自己来实现它.最 ...

  3. moonlight不显示鼠标指针

    多显示屏导致moonlight不显示鼠标指针, 使用的时候关闭其他显示屏,只使用一个显示屏,就可以正常显示了.

  4. 在 Go 语言中,我为什么使用接口

    强调一下是我个人的见解以及接口在 Go 语言中的意义. 如果您写代码已经有了一段时间,我可能不需要过多解释接口所带来的好处,但是在深入探讨 Go 语言中的接口前,我想花一两分钟先来简单介绍一下接口. ...

  5. 【SCOI2013】摩托车交易 - 最大生成树+树链剖分

    题目描述 mzry1992 在打完吊针出院之后,买了辆新摩托车,开始了在周边城市的黄金运送生意.在mzry1992 生活的地方,城市之间是用双向高速公路连接的.另外,每条高速公路有一个载重上限,即在不 ...

  6. Flutter简介

    Flutter简介 Flutter 是 Google推出并开源的移动应用开发框架,主打跨平台.高保真.高性能.开发者可以通过 Dart语言开发 App,一套代码同时运行在 iOS 和 Android平 ...

  7. JavaScript学习系列博客_11_JavaScript中的for语句

    for循环 - 语法: for(①初始化表达式 ; ②条件表达式 ; ④更新表达式){ ③语句... } - 执行流程: 首先执行①初始化表达式,初始化一个变量,(这里只会执行一次) 然后对②条件表达 ...

  8. 如何选择一台适合Java开发的电脑

    前言 最近在群里有同学求推荐Java开发用的电脑,所以胖哥就出个简单的专题,用我贫瘠的电脑知识来帮助大家选择适合开发的电脑配置.因为家里的主机已经带不动两个 IDEA 了,更别提开个 Docker 啥 ...

  9. WordCount (Python)

    Github项目地址:https://github.com/w1036933220/WordCount 一.解题思路 把项目需求理清楚,画一个思维导图 考虑各部分功能所需要的大概实现思路 然后完成了计 ...

  10. 键盘敲入 A 字母时,操作系统期间发生了什么

    前言 键盘可以说是我们最常使用的输入硬件设备了,但身为程序员的你,你知道「键盘敲入A 字母时,操作系统期间发生了什么吗」? 那要想知道这个发生的过程,我们得先了解了解「操作系统是如何管理多种多样的的输 ...