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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程