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. Java中用Apache POI生成excel和word文档

    概述: 近期在做项目的过程中遇到了excel的数据导出和word的图文表报告的导出功能.最后决定用Apache POI来完毕该项功能.本文就项目实现过程中的一些思路与代码与大家共享.同一时候.也作为自 ...

  2. 泛泰A870(高通APQ8064t 600 cpu) Mokee4.4.2(Android4.4) 图赏

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3lob3N0/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...

  3. Xss过滤,只json型数据过滤,图片文件不过滤,采用jsoup

    package com.huaji.fes.filter; import javax.servlet.http.HttpServletRequest;import javax.servlet.http ...

  4. Exception in thread "main" java.lang.NoClassDefFoundError: org/springframework/boot/context/embedded/ServletRegistrationBean

    异常信息 2017-09-02 18:06:37.223 [main] ERROR o.s.boot.SpringApplication - Application startup failed ja ...

  5. .NET 构造Class返回多个json值

    上次总结使用DataTable返回多个值,后来看到一个小哥的返回方式和我的有所不同,便留意了一下.原来他构造一个Class,而我构造的是一个Table. 首先说说两者的区别:拿student举例,st ...

  6. 36、IO模型与socketserver实现并发

    特别声明本随笔copy于egon(林海峰). 一 IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronou ...

  7. 【批处理】shift用法举例

    @echo off set sum=0 call :sub sum 1 2 3 4 echo sum=%sum% pause :sub set /a %1=%1+%2 shift /2 if not ...

  8. ES6之Promise

    Promise是一个对象,用来传递异步操作的消息,他有两个特点:第一对象的状态不受外界的影响,第二一旦状态改变就不会在变,任何时候都可以得到这个结果,他有两个参数分别是resolve(他的作用是将Pr ...

  9. cocoapods管理以及常遇到的问题

    CocoaPods使用 安装成功啦,咱们来创建Podfile文件 //咱们先滚去项目的根目录,如果不会,你就先滚去看看shell命令教程吧 $ cd /Users/JamesGu/Desktop/Co ...

  10. 【实验手册】使用Visual Studio Code 开发.NET Core应用程序

    .NET Core with Visual Studio Code 目录 概述... 2 先决条件... 2 练习1: 安装和配置.NET Core以及Visual Studio Code 扩展... ...