Hoisting(变量提升)
var 和 let 的区别是什么?
答案之一就有 let 不会变量提升
那么,什么是变量提升?
变量提升(Hoisting)被认为是, Javascript中执行上下文 (特别是创建和执行阶段)工作方式的一种认识。 --MDN
基本概念
console.log(a); // 输出 undefined
var a = 1;
这里使用var声明一个变量a,我们却能在声明之前使用,这里究竟发生了什么?
原来,使用var声明一个变量的时候,不管你在哪里声明,执行程序的时候都会先将这个声明移动到作用域的最前面,而赋值操作则留在原处。
以上代码可以看做
var a;
console.log(a); // 输出 undefined
a = 1;
变量提升能否跨作用域
foo()
console.log(a)
function foo() {
var a = a
console.log('foo')
}
执行结果
a is not defined
说明变量提升存在作用域
这里发生了一个有趣的现象,我们在声明函数foo前调用了它,可以看出已经正常执行
所以我们意外地得到一个结论,使用function
声明函数存在整体的提升
上面的代码等同于
function foo() {
var a = a
console.log('foo')
}
foo()
console.log(a)
变量提升能否跨script标签
<script>
console.log(a);
</script>
<script>
var a = 1;
</script>
执行结果
结论 变量提升不能跨script
var和function都存在提升,那么这个提升是否存在优先级
console.log(a)
var a = 1
function a () {}
console.log(a)
执行结果
函数整体提升了,然后给a重新赋值为1,所以先输出了函数
console.log(a)
function a () {}
var a = 1
console.log(a)
执行结果
没有发生变化,我得到的结论是function
会整体提升,var
只是声明一个变量,如果变量已存在则不会再次声明
var声明函数变量不存在整体提升
使用var声明只存在变量提升
console.log(a)
a()
var a = funciton () {}
执行结果
变量提升只会声明一个值为undefined的变量
无个性不签名
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· 【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体