let 、const 、var、function声明关键字的新理解
今天在群里看到大佬们讨论let 、const 的提升问题,有个大佬问
什么阶段?这个真不清楚,以前是只知道let、const存在死区,没有变量提升,一下子就懵了
后经手动实践发现
所谓的const、let不存在变量提升只是仅限于表面,但实际上还是会进行预处理。
创建提升
const a = 2
if(true) {
console.log(a) // Uncaught ReferenceError: Cannot access 'a' before initialization
const a = 1
}
在这段代码中如果if里的a创建不提升,则打印的是a=2,全局变量的2
但这里报的无法在初始化之前访问a错误,所以const虽说是不提升但还是被预处理了
可以这么理解
所谓的创建提升就是把const a 这条语句先进行预处理,给他留一个执行的坑,但实际上const a并没有被执行,a并没有被初始化
第一人称来看:第四行代码告诉编译器 ,我是const a,我要先给在if这个块头部占个坑,我将在console.log(a)的之后进行初始化,你不能先去找其他的狗子(其他的a),你要等我,但是console.log(a)等不及了,你要让我输出你,但是又不给我值,我要找编译器评理了,然后就丢出错误 ReferenceError: Cannot access 'a' before initialization
所以我们常说const、 let 推荐在块作用域的最顶部进行使用,可以避免这种事情发生
初始化提升
var 、function 存在初始化提升
原本的初始化,就是语句在那里出现,则在哪里进行初始化,而var function 关键字则存在初始化提升,会自动提升到顶部进行函数声明,也就是我们常说的变量提升
赋值提升
赋值提升只有function关键字存在
通过下面例子可以很清楚的了解到赋值提升
abc() function abc(){
console.log('I am abc')
}
这里的abc()函数调用是可以成功的,因为函数声明和函数体赋值都被提升到了开头,相当于
function abc(){
console.log('I am abc')
}
abc()
这些都是很基础的变量提升,唯一的新知识就是创建提升
总结!划重点
let、const 在[创建]过程被提升了,但是[初始化]没有提升
var 的[创建] 和[初始化]都被提升了
function的 [创建] [初始化] [赋值] 都被提升了
let 、const 、var、function声明关键字的新理解的更多相关文章
- 当const放在function声明后
#include <iostream> class MyClass { private: int counter; public: void Foo() { std::cout <& ...
- 变量声明关键字var ,let,const
今天带大家了解的是比较有趣的几个变量声明关键字var,let,const. 我们在最初接触JS的时候,变量是我们重要的一个组成部分,在使用时规定必须要先进行声明,否则网页将会报错: console.l ...
- javascript精雕细琢(一):var let const function声明的区别
目录 引言 一.var 二.let 三.const 四.function 五.总结 引言 在学习javascript的过程中,变量是无时无刻不在使用的.那么相对应的,变量声明方法也如是. ...
- ES6的新特性(2)——let 与 const 增强变量声明
let 与 const 增强变量声明 ES6 新增了let命令,用来声明局部变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效,而且有暂时性死区的约束. 先看个var的常见 ...
- JS中var声明与function声明两种函数声明方式的区别
JS中常见的两种函数声明(statement)方式有这两种: // 函数表达式(function expression) var h = function() { // h } // 函数声明(fun ...
- JS中的函数声明和函数表达式的区别,即function(){}和var function(){},以及变量提升、作用域和作用域链
一.前言 Uncaught TypeError: ... is not a function function max(){}表示函数声明,可以放在代码的任何位置,也可以在任何地方成功调用: var ...
- JS中var声明与function声明以及构造函数声明方式的区别
JS中常见的三种函数声明(statement)方式有这三种: // 函数表达式(function expression) var h = function () { // h } // 函数声明(fu ...
- let const var 比较说明
现在先来做两道练习题 for(var i=0;i<10;i++){ var a='a' let b = 'b' } console.log(a) console.log(b) for(var i ...
- js中const,var,let区别(转载)
js中const,var,let区别 来源:https://www.cnblogs.com/zzsdream/p/6372729.html 今天第一次遇到const定义的变量,查阅了相关资料整理了这篇 ...
随机推荐
- 探寻 webpack_bundle_analyzer 原理
webpack_bundle_analyzer 是什么? 这是webpack官方出品的,对项目中模块依赖关系及体积的分析插件,其界面如下: 问题来了,这是如何来进行统计的? 这里提供一个插件的代码,可 ...
- String到底在内存中是如何存储的
String会出现在哪些地方 方法内的局部string 类内的字段String static string 容器中存储的string String数组 那么String的位置会影响其存储方式吗? 显然 ...
- 从无到有构建vue实战项目(五)
八.错误总结(一) webpack打包项目识别子组件路径问题 之所以出现了这样的问题是因为在webpack打包项目时,未将此处的子组件路径正确识别: 将此处的carousel改为carousel.vu ...
- Contiki源码分析--CPU为cc253x里的uart0.c
我所使用的Contiki系统是contiki-sensinode.理解该文需要有cc2530里uart的相关知识,具体寄存器的用法不做介绍. 先放上所有代码,然后再仔细分析. #include < ...
- CDQZ集训DAY4 日记
早上起来之后发现座位被zzh占了,得知座位改为先来后到,什么鬼…… 于是去了另一个有耳机的机房,然而并没有什么卵用. T1上来感觉很有意思,先切50分再说.T2好像是原题的说,切了原题30分后大胆猜测 ...
- [小米OJ] 7. 第一个缺失正数
思路: 参考这个思路 即:将每个数字放在对应的第几个位置上,比如1放在第1个位置上,2放在第2个位置上. 注意几个点:将每个数放在它正确的位置,前提是该数是正数,并且该数小于序列长度,并且交换的两个数 ...
- [leetcode] 406. Queue Reconstruction by Height (medium)
原题 思路: 一开始完全没有思路..看了别人的思路才解出来. 先按照他们的高度从高到低(因为我后面用的从前往后遍历插入,当然也可以从低到高)排序,如果高度一样,那么按照k值从小到大排序. 排完序后我们 ...
- 安卓BindService笔记
1 前言 最近学习到了安卓的service,记录一下自己对BindService的理解,学习教程以及部分代码来自菜鸟教程的android教程:菜鸟教程安卓端BindService链接 2 正文 先贴一 ...
- 【MySQL】(二)InnoDB存储引擎
InnoDB是事务安全的MySQL存储引擎,设计上采用了类似于Oracel数据库的架构.通常来说,InnoDB存储引擎是OLTP应用中核心表的首选存储引擎.同时,也正是因为InnoDB的存在,才使My ...
- 说说Java线程间通信
序言 正文 [一] Java线程间如何通信? 线程间通信的目标是使线程间能够互相发送信号,包括如下几种方式: 1.通过共享对象通信 线程间发送信号的一个简单方式是在共享对象的变量里设置信号值:线程A在 ...