let 、const 、var、function声明关键字的新理解
三种声明都在什么阶段提升?
所谓的const、let不存在变量提升只是仅限于表面,但实际上还是会进行预处理。
创建提升
1 2 3 4 5 | 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关键字存在
通过下面例子可以很清楚的了解到赋值提升
1 abc() 2 3 function abc(){ 4 console.log('I am abc') 5 }
这里的abc()函数调用是可以成功的,因为函数声明和函数体赋值都被提升到了开头,相当于
function abc(){ console.log('I am abc') } abc()
这些都是很基础的变量提升,唯一的新知识就是创建提升
总结!划重点
var 的[创建] 和[初始化]都被提升了
function的 [创建] [初始化] [赋值] 都被提升了
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞