博客
关于我
ES6 块级绑定(二)
阅读量:298 次
发布时间:2019-03-03

本文共 1189 字,大约阅读时间需要 3 分钟。

声明变量的问题

使用 var 声明变量

  1. 允许重复的变量声明:导致数据被覆盖
var a = 1;function print() {     console.log(a);}var a = 2;print(); // 打印2
  1. 变量提升:怪异的数据访问、闭包问题
if (Math.random() < 0.5) {     var a = "abc";  console.log(a);} else {     console.log(a);}console.log(a);
  1. 全局变量挂载到全局对象:全局对象成员污染问题
var abc = "123";console.log(window.abc);

使用 let 声明变量

ES6 不仅引入 let 关键字用于解决变量声明的问题,同时引入了块级作用域的概念

块级作用域:代码执行时遇到花括号,会创建一个块级作用域,花括号结束,销毁块级作用域

声明变量的问题

  1. 全局变量挂载到全局对象:全局对象成员污染问题

let 声明的变量不会挂载到全局对象

  1. 允许重复的变量声明:导致数据被覆盖

let 声明的变量,不允许当前作用域范围内重复声明

在块级作用域中用 let 定义的变量,在作用域外不能访问

  1. 变量提升:怪异的数据访问、闭包问题

使用 let 不会有变量提升,因此,不能在定义 let 变量之前使用它

底层实现上,let 声明的变量实际上也会有提升,但是,提升后会将其放入到“暂时性死区”,如果访问的变量位于暂时性死区,则会报错:“Cannot access ‘a’ before initialization”。当代码运行到该变量的声明语句时,会将其从暂时性死区中移除。

在循环中,用 let 声明的循环变量,会特殊处理,每次进入循环体,都会开启一个新的作用域,并且将循环变量绑定到该作用域(每次循环,使用的是一个全新的循环变量)

在循环中使用 let 声明的循环变量,在循环结束后会销毁

使用 const 声明常量

const 和 let 完全相同,仅在于用 const 声明的变量,必须在声明时赋值,而且不可以重新赋值。

实际上,在开发中,应该尽量使用 const 来声明变量,以保证变量的值不会随意篡改,原因如下:

  1. 根据经验,开发中的很多变量,都是不会更改,也不应该更改的。
  2. 后续的很多框架或者是第三方 JS 库,都要求数据不可变,使用常量可以一定程度上保证这一点。

注意的细节:

  1. 常量不可变,是指声明的常量的内存空间不可变,并不保证内存空间中的地址指向的其他空间不可变。
  2. 常量的命名
    1. 特殊的常量:该常量从字面意义上,一定是不可变的,比如圆周率、月地距地或其他一些绝不可能变化的配置。通常,该常量的名称全部使用大写,多个单词之间用下划线分割
    2. 普通的常量:使用和之前一样的命名即可
  3. 在 for 循环中,循环变量不可以使用常量

转载地址:http://lnlm.baihongyu.com/

你可能感兴趣的文章
XCTF web Web_php_include (php://过滤)
查看>>
记录一次需求变动导致的重构
查看>>
python-requests模块实现ip代理池
查看>>
使用async、await改善异步代码
查看>>
洛谷 1115 最大子段和、HDU 1003 Max Sum(最大字段和问题)
查看>>
BugkuCTF web_1-10
查看>>
POJ 2387 Til the Cows Come Home(Dijkstra优先队列)
查看>>
零基础入门JavaScript 这一篇笔记就够了
查看>>
MySQL_属性、记录长度、设计范式、表关系
查看>>
MySQL_安全管理、表单传值、php操作
查看>>
POJ 2299 Ultra-QuickSort(树状数组+离散化+求逆序数)
查看>>
POJ 3468 A Simple Problem with Integers(线段树+区间更新)
查看>>
BUUCTF web WarmUp
查看>>
hcnp笔记
查看>>
python数据分析
查看>>
MySQL(四)数据库结构设计
查看>>
JavaScript 函数作用域
查看>>
2021-05-03
查看>>
Mybatis-plus 常用注解
查看>>
HTML基本结构
查看>>