一道面试题解析新旧版本浏览器下的变量提升

safari浏览器和ie10及以下的浏览器一样都是低版本的浏览器。

现在最新版本的浏览器要前后都兼容:
->向前兼容ES3/5规范
1.判断体和函数体等不存在块级上下文,上下文只有全局和私有
2.不论条件是否成立,带function的都要声明+定义
-> 向后兼容ES6规范
1.存在块级作用域,大括号中出现let/const/function……都会被认为是块级作用域
2.不论条件是否成立,带function的只提前声明,不会提前赋值了。

1. 在老版本浏览器下的变量提升:
var a = 0;
if (true) {
    a = 1;
    function a() {};
    a = 21;
    console.log(a)//21
}
console.log(a);//21

旧版本浏览器下的图解:
在这里插入图片描述

  1. 在旧版本的浏览器中没有块级作用域,只要有var或者function都会提前声明,function会提前声明加定义。
  2. 代码在执行的时候都会形成一个执行环境栈ECStack,此处的代码是全局下的代码所以会形成一个全局执行上下文EC(G),然后进栈(进入ECStack)执
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值