变量提升练习题

今天有学习前端的小伙伴分享了几个有关变量提升的题目,觉得很有代表性,正好记录下来。

例::

console.log(a)	
var a = 12	

function test() {
    console.log(a)
    a = 13
}
test()
console.log(a)

打印结果:

请添加图片描述

分析:

首先,全局变量a会提升,对于1,2行相当执行了如下代码

var a
console.log(a) //这里的a相当于只声明但未赋值    undefined
a=12

代码执行流进入test函数,函数体内并没有声明a变量,在函数上下文中是找不到a变量的(所有定义的变量都会在上下文关联的变量对象上),所以通过作用域链向全局变量对象上查找变量a,此时变量a的值是12.所以第五行打印的结果是12

在函数内部打印了全局变量a后 ,又对全局变量a进行了修改,值为13。所以在函数执行完毕后,全局变量a的值为13,所以最后一行打印结果 为13。

变:

console.log(a)	
var a = 12	

function test() {
    console.log(a)
    var a = 13
}
test()
console.log(a)

这里是对第一个例子做了一个变形,仅仅把函数体内部 a=13 前面加了个var关键字,下面看打印结果:

请添加图片描述

这也很好理解,区别就在于函数体内部的a变量不再是全局变量:代码执行流进入函数后,会搜索自身上下文中的变量(所有定义的变量都会在上下文关联的变量对象上),此时a变量并未赋值,是undefined,所以打印结果为undefined。注意,这里的a变量为函数的局部变量,我们并没有像之前那样去顺着作用域链去全局上下文中找数据。

最后一行打印的结果为12,因为全局变量a在第一次赋值为12后 并没有被改变。

看到这里可以给弟弟来个三联吗?

请添加图片描述

练一练:

var a = 1

function fn() {
    if (!a) {
        var a = 10
    }
    console.log(a)
}
fn()

打印结果:

请添加图片描述

分析:

代码执行流进入函数,会在函数上下文中找a变量,此时a变量是没有赋值的,值是undefined。所以呀,if判断条件返回结果为true,代码继续执行。a被赋值10,打印a变量自然结果为10。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值