深入理解ES6之—块级绑定
var声明与变量提升
使用var关键字声明的变量,无论其实际声明位置在何处,都会被视为声明于所在函数的顶部(如果声明不在任意函数内,则视为在全局作用域的顶部)。这就是所谓的变量提升。
块级声明
块级声明就是让所声明的变量在指定块的作用域外无法被访问。块级作用域在如下情况被创建:
- 一个函数内部
- 在一个代码块内部
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之—块级绑定的更多相关文章
- 【读书笔记】【深入理解ES6】#1-块级作用域绑定
var声明及变量提升(Hoisting)机制 在函数作用域或全局作用域中通过var关键字声明的变量,无论实际上是在哪里声明的,都会被当成在当前作用域顶部声明的变量.这就是我们常说的提升(Hoistin ...
- ES6之块级作用域
一.前言 在ECMAScript6(以下简称ES6)之前,ECMAScript的作用域只有两种: 1. 全局作用域: 2. 函数作用域. 正是因为有这两种作用域,所以在JavaScript中出现一 ...
- ES6(块级作用域)
我们都知道在javascript里是没有块级作用域的,而ES6添加了块级作用域,块级作用域能带来什么好处呢?为什么会添加这个功能呢?那就得了解ES5没有块级作用域时出现了哪些问题. ES5在没有块级作 ...
- 我理解的BFC(块级格式化上下文)
BFC(Block formatting context) 直译为"块级格式化上下文". BFC它是一个独立的渲染区域,只有Block-level box参与, 它规定了内部的Bl ...
- css盒子模型的深入理解,在块级、行内元素的区别和特性
css盒子模型用于处理元素的内容.内边距.边框和外边距的方式简称.元素框的最内部分是实际的内容,直接包围内容的是内边距.内边距呈现了元素的背景.内边距的边缘是边框.边框以外是外边距,外边距默认是透明的 ...
- 《理解 ES6》阅读整理:块绑定(Block Binding)
变量声明一直是JavaScript中一个需要技巧的部分.在大多数基于C的编程语言中,变量(更正式地说是绑定)在声明的时候创建,然而在JavaScript中并不是这样.在JavaScript中,变量在何 ...
- 深入理解ES6之《块级作用域绑定》
众所周知,js中的var声明存在变量提升机制,因此ESMAScript 6引用了块级作用域来强化对变量生命周期的控制let const 声明不会被提升,有几个需要注意的点1.不能被重复声明 假设作用域 ...
- ES6的 let const 以及块级作用域
let声明变量 用法类似于var,但是所声明的变量只在let所在的代码块内有效. 1 . 在ES6环境下,let声明的变量不能在声明之前调用. 例: console.log(i); //会报错,这叫做 ...
- ES6 - Note1:块级作用域与常量
在ES6以前,ES不支持块级作用域,只有全局作用域和函数作用域,所有变量的声明都存在变量声明提升. 1.let 关键字 声明一个块级变量,只在一个代码块中有效,如果在块外面访问便会报错,如下所示: { ...
随机推荐
- Android OpenGL ES(八)----纹理编程框架
1.把纹理载入进OpenGL中 我们的第一个任务就是把一个图像文件的数据载入到一个OpenGL的纹理中. 作为開始.让我们又一次舍弃第二篇的框架.又一次创建一个程序,新建一个util工具包,在该包下创 ...
- KNN K~近邻算法笔记
K~近邻算法是最简单的机器学习算法.工作原理就是:将新数据的每一个特征与样本集中数据相应的特征进行比較.然后算法提取样本集中特征最相似的数据的分类标签.一般来说.仅仅提取样本数据集中前K个最相似的数据 ...
- Spring基础知识之依赖注入
Spring框架的四大原则: 1)使用POJO进行轻量级和最小侵入式的开发. 2)通过依赖注入和基于接口编程实现松耦合. 3)通过AOP和默认习惯进行声明式编程. 4)使用AOP和模板(templat ...
- redis基础(一)
redis是一种流行的非关系内存型数据库,拥有非常高的读写性能,下面是本人学习的总结. redis的类型 键:redis的所有的键都是string类型: 值:五种类型 string:字符串类型:一个s ...
- 数据库——MySQL——>Java篇
MySQL MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是 ...
- Java快速排序算法
快速排序算法思想: 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一 ...
- 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南
1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...
- redis的set类型
1.简单描述 redis的set类型是string类型数值的无序集合.set元素最大可以包含2的32次方减1个元素.由于set类型是通过hash table实现(旧版本是这样,新版本不确定是不是改用了 ...
- web前端开发 --好多视频大集合--文化的传播者-杜恩德
提醒: 如果需要的话,尽快保存,说不定哪天分享就消失了呢. 1.妙味WEB前端开发全套视频教程 链接: http://pan.baidu.com/s/1bf1Ow2 密码: 2yyu 2.极客学院前端 ...
- spark-submit参数说明--on YARN
示例: spark-submit [--option value] <application jar> [application arguments] 参数名称 含义 --master M ...