【作用域】变量提升

本文深入探讨了JavaScript中的变量提升现象,解释了为何在变量声明前使用变量不会导致错误,以及函数声明如何覆盖变量声明。同时,文章对比了let和const与var在变量提升上的区别,强调了现代JavaScript中变量声明的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是变量提升

先思考下面代码

console.log(a);
var a = 1;
test();
function test(){
  console.log('test is running')
}

结果是

console.log(a); // undefined
var a = 1;
test(); // test is running
function test(){
  console.log('test is running')
}
b=2;

变量a函数test的定义在使用之后,为什么没有报错呢?原因就是我们常说的变量提升

我们知道ES6之前没有块级作用域,只有全局作用域函数作用域。JS在执行脚本之前会先解析代码,在解析的时候会创建一个全局执行上下文,并将其中的变量、函数都先拿出来,并给它们提前在内存中开辟好空间,变量暂时赋值为undefined函数则会声明好,整个存储在内存中,这一步做完了再正式执行程序。函数在执行的时候同理,也会先解析代码,创建一个函数执行上下文,将其中的变量、函数提前准备好。

所以,当执行console.log(a)的时候,JS解析器已经提前把a定义好并赋值为undefined。可以在函数定义前就调用。


二、变量提升的几点注意事项

1.不带var修饰符的变量不会提升
console.log(a); // Uncaught ReferenceError: a is not defined
a = 1;

JS在解析变量时会查找var关键字,如果变量没有通过var来定义,则不能提前定义。

2.函数名和变量名相同时,函数会覆盖变量
// 先定义变量再定义函数的时候
console.log(typeof a); // function
var a = 1;
function a(){}

// 先定义函数再定义变量的时候
console.log(typeof b); // function
function b(){}
var b = 2;

不好意思,function有主角光环,不管你变量怎么调整出场顺序,最后的赢家都是function

3.let 和 const不会有变量提升这种现象
console.log(a); // Uncaught ReferenceError: a is not defined
console.log(b);
let a = 1;
const b = 2;

按照一般的逻辑,变量应该在声明语句之后才可以使用,为了纠正变量提升这种现象,let和const改变了语法行为,它所声明的变量一定要在声明后使用,否则会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值