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定义的变量,查阅了相关资料整理了这篇 ...
随机推荐
- C++学习书籍推荐《More Effective C++》下载
百度云及其他网盘下载地址:点我 编辑推荐 <More Effective C++:35个改善编程与设计的有效方法(中文版)>:传世经典书丛 媒体推荐 <Effective c++&g ...
- 学习2:总结# 1.while # 2.字符串格式化 # 3.运算符 # 4.编码初始
目录 1.while循环 -- 死循环 2.字符串格式化: 3.运算符 4.编码 1.while循环 -- 死循环 while 条件: 循环体 打断死循环: break -- 终止当前循环 改变条件 ...
- Java面试题汇总---基础版(附答案)
基于我个人对面试的认知和招聘经验,在此我总结一下Java开发者的基础知识掌握要求,及应聘者面试的需要准备的内容. 首先,Java基础是每个面试官都会问到的,可能只是针对工作经验的多少,对问题追踪深度有 ...
- 算法导论--最小生成树(Kruskal和Prim算法)
转载出处:勿在浮沙筑高台http://blog.csdn.net/luoshixian099/article/details/51908175 关于图的几个概念定义: 连通图:在无向图中,若任意两个顶 ...
- HttpClient多文件上传代码及普通参数中文乱码问题解决
该随笔记录了在实际项目中使用HttpClient调用外部api,需上传文件和普通参数的代码. 笔者在使用 HttpClient 调用 http api 接口时,需要服务端上传文件和一些普通参数给 ht ...
- 网络框架,互联网的组成,OSI七层协议,抽象层
6.25自我总结 1.网络框架 1.单机 单机游戏 以下两个基于网络的 2.CS架构 cs--->client客户/server服务 服务端(应用程序)一个就够了,客户端(应用程序)可以有多个 ...
- Java面试题 从源码角度分析HashSet实现原理?
面试官:请问HashSet有哪些特点? 应聘者:HashSet实现自set接口,set集合中元素无序且不能重复: 面试官:那么HashSet 如何保证元素不重复? 应聘者:因为HashSet底层是基于 ...
- AQS初体验
AQS初体验 AQS是AbstractQueuedSynchronizer的简称.AQS提供了一种实现阻塞锁和一系列依赖FIFO等待队列的同步器的框架.所谓框架,AQS使用了模板方法的设计模式,为我们 ...
- Git学习(一):版本控制介绍及安装
一.VCS(版本控制系统)的演变 1.集中式VCS的特点 1)有集中的版本管理服务器: 2)具备文件版本管理和分支管理能力: 3)集成效率较没有版本控制(如:进行文件夹标注的方式)有明显地的提高: 4 ...
- 《VR入门系列教程》之21---使用Unity开发GearVR应用
使用Unity开发GearVR应用 上一章我们介绍了如何运用Unity3D开发Oculus Rift应用,当然,这个便宜且强大的游戏引擎也可以用于GearVR的应用开发,这时我们需要用到Ocu ...