【JS】作用域与变量提升面试题

文章详细解释了在ECMAScript中,虽然不推荐在if语句内声明函数,但会导致函数提升和变量提升的非标准行为。这可能导致意外的全局变量赋值。作者强调了遵循ES6规范的重要性以避免潜在的编程错误。
摘要由CSDN通过智能技术生成
var a
if (true) {
  console.log(a);
  a = 5
  function a() { }
  function b() { }
  a = 0
  console.log(a);
}
console.log(a);
console.log(b);

ECMAScript并不推荐在if语句中声明函数,但是按照如上写法运行时,控制台并不报错。

逐行分析:

变量提升(var以及function提升),首先将var a 和 function a() { } function b() { }提升。如果处于函数中,就提到函数的顶部;全局中就会提升到全局的顶部。注意:var 优先级高于 function。

在这里插入图片描述

但是由于if语句中({}作用域)定义函数为非标准写法所以函数a、b提升后并不是函数,此时全局作用域中的a、b是undefined

if (true)

进入if判断后,函数a、b提升到了块级作用域,即if语句中。

所以第一次打印a为是块级作用域中的数据,即: f a() { }

在这里插入图片描述

a = 5

a = 5改变的是块级作用域中的a,即f a() { } 变为了 5,至此,全局a还是undefined,if语句的块级作用域中a变成了5。

function a () {}

由于if中定义function是非标准写法,所以这一步会造成将块级作用域中的a(上一步操作后,当前为5)赋值给全局中的a。

至此,全局中a为5,if块级作用域中a为5。

function b () {}

同上一步,由于if中定义function是非标准写法,所以这一步会造成将块级作用域中的b(上一步操作后,当前为f b() { })赋值给全局中的b。

至此,全局中b为f b() { },if块级作用域中b为f b() { }

a = 0

将if块级作用域中的a重新赋值为0。

至此,全局中a为5,if块级作用域中a为0。

console.log(a)

取当前作用域(if)中的a,所以打印0

console.log(a) console.log(b)

最后两步取得是全局的a和b,所以分别打印5和 f b() { }

结果

在这里插入图片描述

所以实际开发中要符合ECMAScript的规范并且尽可能少的使用var,以免造成bug。

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

田本初

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值