一、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关键字及变量的提升的更多相关文章

  1. ES6中class关键字

    1 .介绍 //定义类 class Point { constructor(x, y) { this.x = x; this.y = y; } toString() { return '(' + th ...

  2. JS高级. 05 词法作用域、变量名提升、作用域链、闭包

    作用域 域,表示的是一个范围,作用域,就是作用范围. 作用域说明的是一个变量可以在什么地方被使用,什么地方不能被使用. 块级作用域 JavaScript中没有块级作用域 { var num = 123 ...

  3. javascript变量声明提升和函数声明提升

    在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分. JS的解析过程分为两个阶段:预 ...

  4. 解读JavaScript中的Hoisting机制(js变量声明提升机制)

    hoisting机制:javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面. 知识点一:javascript是没有 ...

  5. js中函数声明先提升还是变量先提升

    根据官方书籍<你不知道的javascript>(上卷)中写道: "函数会首先被提升,然后才是变量". 例子: console.log(foo); function fo ...

  6. ES6中的关键字 - let

    let关键字 1.let关键字声明的变量仅仅在自己的块级作用域内起作用,出了块级作用域就不起作用了: var arr2 = []; for (let index = 0; index < 10; ...

  7. JavaScript var关键字、变量的状态、异常处理、命名规范等介绍

    本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...

  8. 16-static和extern关键字2-对变量的作用

    上一讲介绍了static和extern对函数的作用,static用来定义一个内部函数,不允许其他文件访问:extern用来定义和声明一个外部函数,允许其他文件访问.static和extern对变量也有 ...

  9. 变量声明提升 Vs. 函数声明提升

    1. 变量声明提升 先看以下代码: 1)var in_window = "a" in window; console.log(in_window); 2)var in_window ...

随机推荐

  1. MQTT研究之EMQ:【基础研究】

    EMQ版本V2, emqttd-centos7-v2.3.11-1.el7.centos.x86_64.rpm 下载地址:http://emqtt.com/downloads/2318/centos7 ...

  2. DateTime?,也是一种类型,代表DateTime或NULL两种类型,在处理空时间时比较有用

    public static DateTime? GetDateTimeFromStr(string date) { if (date.Trim() == string.Empty) return nu ...

  3. DS-1

    一.作业题目 仿照三元组或复数的抽象数据类型写出有理数抽象数据类型的描述 (有理数是其分子.分母均为整数且分母不为零的分数). 有理数基本运算: 构造有理数T,元素e1,e2分别被赋以分子.分母值 销 ...

  4. DLL简单分析与调用方法

    最近为了分析一个没有代码的DLL有哪些函数,找了各种方法. 把结果分享一下:三个方法都没法得到函数的参数,有点让我失望. DLL Export Viewer NikPEViewer Dumpbin 配 ...

  5. 日志监控文件中获取ip,每一分钟统计一次,超过200次的计入黑名单

    一.日志文件access.log #.要从日志里面找到1分钟之内访问超过200次的 #.每分钟都运行一次 #.读取文件内容,获取到ip地址 #.把每个ip地址存起来{} #.判断ip访问的次数是否超过 ...

  6. Java核心-多线程-并发控制器-CountDownLatch倒数闩

    1.基本概念 CountDownLatch,中文名倒数闩,jdk并发工具包中一个并发控制器,它抽象了一个常见的多线程并发场景,开发人员使用它可以写出同时兼顾线程安全性与高效率的代码. 2.抽象模型 相 ...

  7. ROS多根adsl叠加负载均衡PCC的做法

    命令行: / ip firewall mangle1.保证访问局域网IP的时候不被PCC了.add chain=prerouting dst-address=10.1.1.0/24 action=ac ...

  8. thinkphp url build 生成localhost.localhost的解决方案

    找到框架核心Url.php的下面一段代码 // 原代码// URL组装$url = $domain . rtrim($this->root ?: $this->app['request'] ...

  9. WebApi设置HttpContext.Current.User

    1.Web.config配置上system.web节点下加入以下配置 <system.web> <authentication mode="Forms"> ...

  10. petapoco模板修改

    [Reference(ReferenceType.Many, ColumnName = "OneId", ReferenceMemberName = "OneId&quo ...