← 返回目录

第 2 卷

第 2 / 19 卷日期:

(2)具体问题

  1. 变量提前访问返回undefined:变量在声明前访问不会报错,而是返回 undefined,容易让开发

者误以为变量已赋值,从而引发逻辑错误。

Code block

1if (false) { 2var b = 20;

3} 4console.log(b); // undefined(b被变量提升,不受if块级作用域限制,未赋值)

  1. 变量意外覆盖:由于 var 变量无块级作用域且提升特性,容易覆盖上层作用域的变量。

Code block

1var name = "张三";

2function test() {

3console.log(name);// undefined(局部变量name提升,覆盖了全局变量)
4var name = "李四";
5}
6test();
  1. 函数声明与变量声明冲突:函数声明的提升优先级高于变量声明,可能导致变量赋值被函数声明覆

盖,引发预期外的结果。

Code block

1var fn = 30;

2function fn() { 3console.log("函数");

4} 5console.log(fn); // 30(函数声明先提升,后续变量赋值覆盖了函数)

6 7// 反之

8function fn() { 9console.log("函数");

10} 11var fn;

12console.log(fn); // [Function: fn](变量声明提升不覆盖函数声明)

  1. 如何定义“作用域”?请举例说明不同类型的作用域。

(1)作用域(Scope)定义

作用域是指变量、函数和对象的可访问范围,它规定了代码中各个标识符(变量名、函数名等)的可见性,决定了哪里可以访问某个变量或函数,哪里无法访问,其核心目的是隔离变量、避免命名冲

突,并控制变量的生命周期。

(2)JavaScript中的作用域类型及示例

JavaScript主要包含3种作用域类型(ES6之前为全局作用域和函数作用域,ES6新增块级作用域):

  1. 全局作用域(Global Scope)

◦ 特点:在代码的任何位置(函数内部、块内部等)都可访问,声明在全局作用域的变量称为全

局变量,其生命周期伴随整个程序的运行(浏览器中直到页面关闭,Node.js中直到进程退出)。

◦ 示例:

Code block

1//全局变量:在浏览器中挂载到window对象,Node.js中挂载到global对象
2var globalName = "全局变量";
3const globalAge = 20;

4 5function testGlobal() {

6console.log(globalName);//可访问:"全局变量"
7console.log(globalAge);//可访问:20
8}
9testGlobal();
10console.log(globalName);//可访问:"全局变量"
  1. 函数作用域(Function Scope)

◦ 特点:变量仅在声明它的函数内部可访问,函数外部无法访问,也称为局部作用域,声明在函

数内部的变量称为局部变量,其生命周期随函数调用的结束而销毁(除非被闭包引用)。

◦ 示例:

Code block

1function testFunction() { 2// 函数局部变量,仅函数内部可访问

3var localName = "函数局部变量";

9console.log(localAge); // 报错:ReferenceError: localAge is not defined

  1. 块级作用域(Block Scope,ES6新增)

◦ 特点:由 {} 包裹的代码块(如 if、 for、 while、直接写的 {} 等)形成的作用域,变

量仅在该块内部可访问, let 和 const 声明的变量才会绑定块级作用域, var 声明的变量不绑定。

◦ 示例:

Code block

1// 1. if块级作用域 2if (true) {

3let blockName = "块级变量";

4var varName = "var变量(无块级作用域)";
5console.log(blockName);//可访问:"块级变量"
6}
7console.log(varName);//可访问:"var变量(无块级作用域)"
8console.log(blockName);//报错:ReferenceError: blockName is not defined

9 10// 2. for循环块级作用域

11for (let i = 0; i < 3; i++) {

12console.log(i);// 0、1、2(每次循环创建独立的i变量)
13}
14console.log(i);//报错:ReferenceError: i is not defined

15 16// 3. 直接使用{}创建块级作用域

17{ 18const blockAge = 30;

19console.log(blockAge);//可访问:30
20}
21console.log(blockAge);//报错:ReferenceError: blockAge is not defined
  1. 请解释什么是作用域链及其在JavaScript中的作用?

(1)作用域链(Scope Chain)定义

作用域链是当前执行上下文的变量查找路径,它是一个由多个变量对象(VO/AO)组成的链式结构。

当JavaScript需要访问某个变量时,会先从当前执行上下文的变量对象中查找,若查找不到,则会沿

全站分卷索引 · 19 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷
  7. 7第 7 卷
  8. 8第 8 卷
  9. 9第 9 卷
  10. 10第 10 卷
  11. 11第 11 卷
  12. 12第 12 卷
  13. 13第 13 卷
  14. 14第 14 卷
  15. 15第 15 卷
  16. 16第 16 卷
  17. 17第 17 卷
  18. 18第 18 卷
  19. 19第 19 卷