var声明与变量提升

使用var关键字声明的变量,无论其实际声明位置在何处,都会被视为声明于所在函数的顶部(如果声明不在任意函数内,则视为在全局作用域的顶部)。这就是所谓的变量提升。

块级声明

块级声明就是让所声明的变量在指定块的作用域外无法被访问。块级作用域在如下情况被创建:

  1. 一个函数内部
  2. 在一个代码块内部

let声明

let声明的语法和var的语法一致。基本可以使用let替换var,但会将变量的作用域限制在当前代码块中。let声明不会被提升到当前代码块的顶部。

禁止重复声明

如果一个标识符在代码内部被定义,那么在此代码块内部使用同一个标识符进行let声明就会导致抛出错误。

var count = 30;
let count = 40;//语法错误

如果在嵌套作用域内使用let声明一个同名的新变量,则不会抛出错误。

var count = 30;
if(condition){
let count = 40;//不会抛出错误
}

常量声明

使用const进行常量的声明,它们的值在被设置完成之后就不能再被改变。正因为如此,所有的const变量都需要在声明时进行初始化

const MAX_ITEMS = 30;
const NAME;//语法错误

常量与let声明都是块级声明。与let声明类似,const声明会在同一作用域内定义一个已有变量时会刨除错误,无论改变了是var声明还是let声明。

var message = "HELLO";
let age = 25; //二者都会抛出错误
const message = "Goodbye";
const age = 23;

let与const一个重大区别是:试图对之前用const声明的常量进行赋值会抛出错误,无论在严格模式还是非严格模式下

const maxItems = 30;
maxItems = 35;//抛出错误

但是如果const定义的常量如果是一个对象,它所包含的值是可以修改的。

var const person = {
name = "cc"
} //正常工作
person.name = "dd"; //抛出错误
person = {
name = "aa";
}

全局块级绑定

let和const不同于var的另一个方面是在全局作用域上的表现。当在全局作用域上使用var时,它会创建一个新的全局变量,并成为全局对象(在浏览器中是window)的一个属性。这意味着使用var可能会无意覆盖一个已有的全局属性。

var RegExp = "hello";
console.log(window.RegExp);//"hello" var ncz = "hi";
console.log(window.ncz);

在全局作用域上使用let或const,虽然会在全局作用域上创建新的绑定,但不会有任何属性被添加到全局对象上。这也就意味着你不能用let或const来覆盖一个全局变量,你只能将其屏蔽。

 let RegExp = "hello";
console.log(window.RegExp);//function
console.log(window.RegExp === RegExp);//false const ncz = "hi";
console.log(ncz);//hi
console.log("ncz" in window);//false

随着更多的开发者迁移到es6上,一种替代方案变得更为流行,那就是在默认情况下使用const,并且只有在知道变量值需要被更改的情况下才使用let。其理论依据是大部分变量在初始化之后都不应当被修改,因为预期外的改动是bug的源头之一。

深入理解ES6之—块级绑定的更多相关文章

  1. 【读书笔记】【深入理解ES6】#1-块级作用域绑定

    var声明及变量提升(Hoisting)机制 在函数作用域或全局作用域中通过var关键字声明的变量,无论实际上是在哪里声明的,都会被当成在当前作用域顶部声明的变量.这就是我们常说的提升(Hoistin ...

  2. ES6之块级作用域

    一.前言 在ECMAScript6(以下简称ES6)之前,ECMAScript的作用域只有两种: 1.  全局作用域: 2.  函数作用域. 正是因为有这两种作用域,所以在JavaScript中出现一 ...

  3. ES6(块级作用域)

    我们都知道在javascript里是没有块级作用域的,而ES6添加了块级作用域,块级作用域能带来什么好处呢?为什么会添加这个功能呢?那就得了解ES5没有块级作用域时出现了哪些问题. ES5在没有块级作 ...

  4. 我理解的BFC(块级格式化上下文)

    BFC(Block formatting context) 直译为"块级格式化上下文". BFC它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Bl ...

  5. css盒子模型的深入理解,在块级、行内元素的区别和特性

    css盒子模型用于处理元素的内容.内边距.边框和外边距的方式简称.元素框的最内部分是实际的内容,直接包围内容的是内边距.内边距呈现了元素的背景.内边距的边缘是边框.边框以外是外边距,外边距默认是透明的 ...

  6. 《理解 ES6》阅读整理:块绑定(Block Binding)

    变量声明一直是JavaScript中一个需要技巧的部分.在大多数基于C的编程语言中,变量(更正式地说是绑定)在声明的时候创建,然而在JavaScript中并不是这样.在JavaScript中,变量在何 ...

  7. 深入理解ES6之《块级作用域绑定》

    众所周知,js中的var声明存在变量提升机制,因此ESMAScript 6引用了块级作用域来强化对变量生命周期的控制let const 声明不会被提升,有几个需要注意的点1.不能被重复声明 假设作用域 ...

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

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

  9. ES6 - Note1:块级作用域与常量

    在ES6以前,ES不支持块级作用域,只有全局作用域和函数作用域,所有变量的声明都存在变量声明提升. 1.let 关键字 声明一个块级变量,只在一个代码块中有效,如果在块外面访问便会报错,如下所示: { ...

随机推荐

  1. WAS集群系列(2):数据库连接低级错误——网络连接问题

    环境 项目点 指标 WAS版本号 7.0 应用server操作系统 Windows 2008 应用server系统位数 64bit 数据库server操作系统 CentOS 5.6 数据库版本号 Or ...

  2. 在线安装eclipse中html/jsp/xml editor插件(很可靠)

    之前有一篇文章也是安装eclipse中的web开发插件 ,可是经过非常多人使用,那种方法.不是全部人使用都能够. 接下来,找到一种很管用的方法.就是在线安装. 废话不多说,这样的方法绝对能够成功安装. ...

  3. 报表开发之扩展GROUP BY

    在实际运用中.比方在数据仓库中,常常须要对数据进行多维分析.不仅须要标准分组的结果(相当于 GROUP BY),还须要不同维度的小计(简单 GROUP BY 中取部分列分组)和合计(不分组).从而 提 ...

  4. django的CMS系统(内容管理系统)

    一.什么是CMS系统 CMS具有许多基于模板的优秀设计,可以减少开发的成本. CMS的功能并不只限于文本处理,它也可以处理图片.Flash动画.声像流.图像甚至电子邮件档案. CMS还分各个平台脚本种 ...

  5. Redis 订阅发布 - Jedis实现

    Redis 订阅发布 - Jedis实现 我想到使用Redis的订阅发布模式是用来解决推送问题的-. 对于概念性的叙述,多多少少还是要提一下的: ​ 什么是Redis发布订阅?Redis发布订阅是一种 ...

  6. 详解MongoDB管理命令

    MongoDB是一个NoSQL数据库系统:一个数据库可以包含多个集合(Collection),每个集合对应于关系数据库中的表:而每个集合中可以存储一组由列标识的记录,列是可以自由定义的,非常灵活,由一 ...

  7. 【java】io流之字符输入流:java.io.Reader类及子类的子类java.io.FileReader

    package 文件操作; import java.io.File; import java.io.FileReader; import java.io.IOException; import jav ...

  8. Java之数据类型,变量赋值

    Java中的基础数据类型(四类八种): 1.整数型 byte----使用byte关键字来定义byte型变量,可以一次定义多个变量并对其进行赋值,也可以不进行赋值.byte型是整型中所分配的内存空间是最 ...

  9. for循环语句以及输出语句

    action() { int  i;  //定义变量    lr_start_transaction("submit_answer");  //开始事物    for(i=0; i ...

  10. 二叉树Bynary_Tree(2):二叉树的递归遍历

    7/18/2017 正在码,理解完就写博 7/21/2017 终于码完,借助链表实现的队列撸一个二叉树对于我来说有难度,撸了两天没有成果,我最后选用的是数组实现的循环队列去撸一个二叉树 正文如下: 以 ...