一、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. Excel技巧--提取中文字串

    类似的,如果要提取上图第1列的商品,不要型号,如第2列. 可以考虑使用SEARCHB函数. searchb与search的区别,在于searchb函数以字节为单位搜索,search函数以字符为单位搜索 ...

  2. 图像三维灰度分布图——matlab

    p=imread('C:\Users\wangd\Documents\MATLAB\1.jpg'); g=rgb2gray(p); % 转为灰阶图 gg=double(g); % 转为数值矩阵 gg= ...

  3. CentOS7.3安装Go运行和开发环境

    https://blog.csdn.net/warnerwu/article/details/73825105

  4. 没有可用软件包 libgdiplus 解决方法

    1.下载 epel-release-7-11.noarch.rpm wget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel ...

  5. linux 线程同步

    参考链接:https://blog.csdn.net/daaikuaichuan/article/details/82950711#font_size5font_2 一,互斥锁 #include &l ...

  6. 纵观 jBPM:从 jBPM3 到 jBPM5 以及 Activiti5

    https://www.infoq.cn/article/rh-jbpm5-activiti5# 对jBPM来说,今年最大的事件莫过于 jBPM 的创建者Tom Baeyens离开 JBoss 了.T ...

  7. 【CentOS】设置定时执行任务

    1.Crond服务启动状态确认 service crond status crond (pid ) を実行中... 2.追加新的执行任务 crontab -e #Ansible: dnsmasq fo ...

  8. ADO.Net操作数据库的方式

    1.使用数据提供程序执行sql或者ddl语句操作数据库. 2.使用oledb操作数据库 3.使用odbc操作数据库 4.使用DataSet操作数据库 前面3种方式都无法避免要使用sql语句,对不同种类 ...

  9. 解决spring-boot配置文件使用加密方式保存敏感数据启动报错No decryption for FailsafeTextEncryptor. Did you configure the keystore correctly

    spring-boot配置文件使用加密方式保存敏感数据 application.yml spring: datasource: username: dbuser password: '{cipher} ...

  10. 事务回滚 try catch

    USE tempdb IF OBJECT_ID ('dbo.test') IS NOT NULL DROP TABLE dbo.test GO CREATE TABLE dbo.test ( id I ...