JS面试题-有关作用域提升的一些面试题(附详细解答)

本文详细解析了JavaScript中的作用域链、变量提升以及函数内部的变量查找规则。通过四个示例,阐述了全局作用域、局部作用域、变量声明提前以及函数内部的变量状态变化,帮助理解JavaScript中变量的生命周期和作用域概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、

var n = 100;

function foo() {
  n = 200;
}

foo();

console.log(n);

这题毫无疑问,答案是200。

foo函数内部没找到n,往上在全局作用域中找到了n的定义,并为其重新赋值为200。


二、

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

var n = 100;
foo();

这题的答案是 undefined 和 200 。

分析过程如下:foo函数内的n有变量提升,第一次使用n时为undefined, 第二次使用之前就被赋值为200了。


三、

var n = 100;

function foo1() {
    console.log(n); // 100
}

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

foo2();
console.log(n); // 100

这里为了方便观察,就把答案直接用注释的方式写在代码里面。

函数作用域链是由代码的书写位置决定的,所以在当前位置找不到,会去代码书写位置的上一层作用域找。

所以foo1中的n是等于全局作用域中的100,而不是foo2作用域中的200.


四、

var a = 100;

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

foo();

结果为undefined。

这题乍一看挺容易被迷惑,想当然地认为return后面的代码不会被执行,会直接向全局作用域去找a。其实foo函数内的a还是会有变量提升,所以此时打印的a是undefined。


五、

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

foo();

// console.log(a); 这里会报错
console.log(b);

结果为 100;

乍一看以为是函数作用域内的值在外面是取不到的,其实foo函数内的那行代码可以拆解为下面的两行代码。

var a = 10;
b = 10;
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值