ES6你不知道的let关键字及变量的提升
一、JavaScript变量创建到访问赋值的过程
- 创建 create/declare
 - 初始化 initialize
 - 赋值 assign
 
1、函数的提升
// 函数这种变量声明,首先会创建变量,再初始化,最后开始执行代码
doSth();
function doSth(){
  var a = 1;
  var b = 2;
  console.log(a,b);
}
- 1、找到function声明的变量,在环境中创建这些变量
 - 2、初始化这些变量,本例中将doSth(){ var a = 1; var b = 2; console.log(a,b); }的值初始化到 doSth
 - 3、执行doSth这个函数
 
2、var变量的提升
// 此例子跟函数变量提升一致,但是var变量提升过程不一样
// 首先 创建变量,再初始化,随即执行代码(在此之前没有赋值)
doSth();
function doSth(){
  console.log(a);
  var a = 1;
  var b = 2;
  console.log(b);
}
- 1、函数内部收集var 变量声明,并在环境中创建这些变量,本例子中的var a,var b ;
 - 2、变量初始化,及var a = undefined ;var b = undefined;
 - 3、开始在环境中执行代码:从第一行console.log(a);开始,此时a为undefined,第二行 var a =1 ;给a 赋值;第三行给b赋值;第四行输出2;
 
3、let的变量提升过程
// 首先创建变量,随即执行代码(在此之前没有赋值),执行代码的第一次赋值即为初始化,若后续再次赋值,则是真的赋值;
{
    console.log(x);
    let x = 1;
    x = 2;
    let y = 3;
    console.log(y)
}
- 1、收集所有的let声明:x 及y;创建这些变量;(此时并没有初始化)
 - 2、执行代码:
 
// 执行第一行代码:
console.log(x); // 会抛出错误“Uncaught ReferenceError: x is not defined”
// 执行第二行代码
let x = 1;// 初始化x =1 ,此时为初始化(并不是赋值)。初始化的值为1
// 执行第三行代码
x = 2 // 此时为x赋值2
// 执行第四行代码
let y = 3; 此时为变量y初始化,初始化的值为3
// 执行第五行代码
console.log(y)// 3
4、临时死区TDZ(Temporal Dead Zone)
在let /const 变量声明前调用该变量都是放到这个TDZ中,如果引用或者访问该变量了就会报错Uncaught ReferenceError
// 源代码
{
    a = 2;
    let a ;
    a = 3
}
// 加入TDZ后的代码
{
    // 变量提升,创建
    let a ;
    // TDZ 区开始---
    a = 2;
    a ;//此时等同于a 初始化为undefined
    // TDZ 区结束---
    // 此时可以访问a
    a = 3
}												
											ES6你不知道的let关键字及变量的提升的更多相关文章
- ES6中class关键字
		
1 .介绍 //定义类 class Point { constructor(x, y) { this.x = x; this.y = y; } toString() { return '(' + th ...
 - JS高级. 05 词法作用域、变量名提升、作用域链、闭包
		
作用域 域,表示的是一个范围,作用域,就是作用范围. 作用域说明的是一个变量可以在什么地方被使用,什么地方不能被使用. 块级作用域 JavaScript中没有块级作用域 { var num = 123 ...
 - javascript变量声明提升和函数声明提升
		
在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分. JS的解析过程分为两个阶段:预 ...
 - 解读JavaScript中的Hoisting机制(js变量声明提升机制)
		
hoisting机制:javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面. 知识点一:javascript是没有 ...
 - js中函数声明先提升还是变量先提升
		
根据官方书籍<你不知道的javascript>(上卷)中写道: "函数会首先被提升,然后才是变量". 例子: console.log(foo); function fo ...
 - ES6中的关键字 - let
		
let关键字 1.let关键字声明的变量仅仅在自己的块级作用域内起作用,出了块级作用域就不起作用了: var arr2 = []; for (let index = 0; index < 10; ...
 - JavaScript var关键字、变量的状态、异常处理、命名规范等介绍
		
本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...
 - 16-static和extern关键字2-对变量的作用
		
上一讲介绍了static和extern对函数的作用,static用来定义一个内部函数,不允许其他文件访问:extern用来定义和声明一个外部函数,允许其他文件访问.static和extern对变量也有 ...
 - 变量声明提升 Vs. 函数声明提升
		
1. 变量声明提升 先看以下代码: 1)var in_window = "a" in window; console.log(in_window); 2)var in_window ...
 
随机推荐
- 在CentOS 7上安装Nginx
			
本教程中的步骤要求用户拥有root权限 第一步 - 添加Nginx存储库要添加CentOS 7 EPEL仓库,请打开终端并使用以下命令: sudo yum install epel-release第二 ...
 - Skin Microstructure Deformation with Displacement Map Convolution项目小结
			
经常有人问我你最近在干什么,但一句话真的很难说明白,最近两个月一直在尝试将Skin Microstructure Deformation with Displacement Map Convoluti ...
 - CentOS7.3安装Go运行和开发环境
			
https://blog.csdn.net/warnerwu/article/details/73825105
 - JavaScript最后的课程笔记
			
一.快捷位置和尺寸 DOM已经提供给我们计算后的样式,但是还觉得不方便,所以DOM又提供给我们一些API: ele.offsetLeft ele.offsetTop ele.offsetWidth e ...
 - 【Eclipse】_Eclipse自动补全增强方法 & 常用快捷键
			
一,Eclipse自动补全增强方法 在Eclipse中,从Window -> preferences -> Java -> Editor -> Content assist - ...
 - nginx1.14.0版本server、location、rewrite配置
			
server配置demo 在192.168.10.140(centos7)上修改: /home/program/nginx/conf/nginx.conf 添加一个server server { li ...
 - oracle dg 报错提示 涉及硬盘错误
			
###oracle dg 报错提示 涉及硬盘错误 Dec 23 03:28:01 xhisdg rsyslogd: [origin software="rsyslogd" swVe ...
 - day1.接口测试(概念、Postman、SoapUI、jmeter)
			
一.什么是接口测试 接口测试是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点.测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑 ...
 - tomcat和iis共用80端口的简明手册
			
对于使用tomcat-connector实现iis与tomcat实现80端口共用的问题,网上的信息异常混乱,很多地方误人子弟,浪费时间.本文给出简明手册式的做法: 首先列出我们需要做的事项: 1. ...
 - Vue 学习(1)
			
<!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta cha ...