关于作用域提升的一些题目

1.第一题

var n = 100
function foo() {
  n = 200
}
foo()
console.log(n)

答案:200

执行过程:

在编译阶段先创建了一个Go对象{n:undefined,foo:0xa00}

然后对n进行赋值等于100,创建一个foo函数对象

在调用foo这个函数之后,foo会对n进行赋值为200,
在进行这个赋值的行为之前,会现在自己的作用域里面寻找有没有n,如果没有的话,就去父级作用域里面找,在这边的父级作用域中可以找到n。

所以n的情况是先变为100在变为200。

2.第二题

function foo() {
  console.log(n)
  var n = 200
  console.log(n)
}
var n = 100
foo()

答案:undefine 200

执行过程:

在编译阶段先创建了一个Go对象{foo:0xa00,n:undefined}
然后创建一个foo函数对象,对n赋值等于100
再去执行函数

在调用foo这个函数之后,foo自己本身的作用域里面是有n的,但是在编译阶段n=undefined,所以第一次打印n的时候foo现在自己的作用域里找n,n就是undefined。然后n赋值为200,第二次打印n的时候n就等于200

第三题:

var n = 100;
function foo1() {
	console.log(n);
}
function foo2() {
	var n = 200;
	console.log(n);
	foo1();
}
foo2();
console.log(n);

答案:

200 100 100

执行过程:

在编译阶段先创建了一个Go对象{n:undefined,foo1:0xa00,foo2:0xa01}

然后再创建foo1函数对象和foo1函数对象

调用foo2()的时候 由于foo2函数自身作用域有n
所以第一次打印结果是200,
然后再去调用foo1,调用foo1的时候要注意,foo1的父级作用域仍然是全局的,所以这边foo1在自身作用域找不到n,就去找全局的n,所以第二次打印结果是100,
第三次打印结果打印的是全局作用域的n,所以结果是100

第四题:

var a = 100;
function foo() {
	console.log(a);
	return;
	var a = 200;
}
foo();

答案:undefined

执行过程:

在编译阶段先创建了一个Go对象{a:undefined,foo:0xa00}
然后再创建foo函数对象

先对a进行赋值为100
然后在调用foo函数,在调用foo函数的时候
编译阶段return是不起作用的,所以在编译阶段foo函数本身会创建{a:undefined}.
执行阶段foo自身已经有a了,所以打印的是自身作用域的a,
打印结果是undefined

第五题:

function foo() {
	var a = b = 10;
}

foo();

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

结果:

undefined 10

执行过程 在调用foo的时候,
首先会执行b=10,这样的话b就会被当作全局变量
然后var a = 10

所以打印结果是undefined 10

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值