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

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

posted @   w灰二  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示