浅聊JavaScript中的Hoisting(变量提升)

一直有写博客的想法但因为懒惰等各种情况没有付出实际行动,择日不如撞日,那就今天让我给大家简单归纳总结一下JavaScript中的Hoisting(变量提升)吧!

1.对于变量
//variables

console.log(me);
console.log(job);
console.log(year);


var me='Ascend';
let job='student';
const year=2001;

结果如下:

image-20220806171302606

这里我们看到变量me可以输出出来但是值为undefined,但是job不可以(year也不可以)。

2.对于函数
//functions

console.log(addDecl(2,3));
console.log(addExpr(2,3));
console.log(addArrow(2,3));

function addDecl(a,b){
    return a+b;
}

const addExpr=function (a,b){
    return a+b;
}

const addArrow=(a,b)=>a+b;

结果如下:

image-20220806171752898

当我把从const改为var后,

var addExpr=function (a,b){
    return a+b;
}

var addArrow=(a,b)=>a+b;

结果如下:

image-20220806171929457

告诉我们addExpr不是一个函数,与之前的错误提示不同.奇怪了,这明明就是一个函数为什么不是呢?

于是我直接输出addExpr,

console.log(addExpr);

得到如下结果:

image-20220806172127326

我们发现addExpr实际上的值为undefined,undefined当然不是一个函数了!可是为什么值是undefined呢,参考第一点中的me,输出仍为undefined,所以我们可以感觉好像对于var声明的变量或函数,在hoisting时候值均为undefined。

3.一个例子
// example

if(!numProducts) deleteShoppingCart();

var numProducts=10;

function deleteShoppingCart(){
    console.log(`All products deleted!`);
}

猜一猜输出结果?

image-20220806172641293

跟上面一样,虽然在下面numProducts值为10,但是在hoisting时候初始值为undefined,所以上述结果就不奇怪了。

小小提示一下,在实际开发过程中,尽量不要使用var,用const和let足够了。

附:

类型变量提升初始值作用域
函数声明Yes就是实际的函数本身Block(块)
var变量YesundefinedFunction
let和const变量No(从技术上讲,其实是有的;但实际上并没有,有点迷惑,不用管)uninitialized,TDZBlock(块)
函数表达式或者箭头函数取决于使用let还是var声明函数(同上)//
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值