今天有学习前端的小伙伴分享了几个有关变量提升的题目,觉得很有代表性,正好记录下来。
例::
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。