全部学科
Python全栈
python
NodeJS全栈
nodejs
📝 1 篇文章 20 道配套习题

JS 函数与作用域

专题说明

本专题系统讲解JavaScript函数与作用域的核心知识,涵盖函数定义方式、参数传递机制、返回值、作用域类型、变量提升机制、闭包原理与应用、箭头函数特性等内容。

学习目标

  1. 掌握函数声明、函数表达式、箭头函数的定义方式
  2. 理解参数传递机制(值传递、默认参数、剩余参数)
  3. 掌握返回值与return语句的使用
  4. 理解全局作用域、函数作用域、块级作用域的区别
  5. 掌握变量提升与暂时性死区(TDZ)机制
  6. 理解闭包的原理、应用场景及内存管理
  7. 掌握箭头函数的特性与使用场景

学习内容

本专题涵盖以下核心知识点:

  • 函数定义与调用:函数声明、函数表达式、Function构造函数、函数提升
  • 参数传递:值传递机制、默认参数、arguments对象、剩余参数
  • 返回值:return语句、返回值类型、无返回值情况
  • 作用域与变量提升:全局作用域、函数作用域、块级作用域、var提升、TDZ
  • 闭包:闭包原理、闭包应用、循环闭包问题、IIFE、内存管理
  • 箭头函数:语法简写、this绑定、arguments、构造函数限制

学习建议

  1. 重点理解函数声明与函数表达式的提升差异
  2. 区分基本类型和引用类型的参数传递机制
  3. 掌握var、let、const的作用域和提升差异
  4. 理解闭包的形成原理,掌握循环闭包问题的解决方案
  5. 注意箭头函数的this绑定特性,避免误用于对象方法
  6. 实践闭包应用场景:计数器、模块化、函数工厂

📝 配套习题(20 题)

💡 参考答案在文末
判断题
1

ES6 可以使用默认参数语法 function fn(a = 1, b = 2) 为参数设置默认值。

A

B

2

函数声明会被提升到作用域顶部,而函数表达式不会。

A

B

3

箭头函数的 this 绑定在定义时就确定了,无法通过 call、apply、bind 改变。

A

B

单选题
4

以下代码输出结果是什么?

JavaScript
function greet(name) {
    console.log("Hello, " + name);
}
let result = greet("World");
console.log(result);
A

"Hello, World"

B

undefined

C

null

D

""

5

以下代码输出结果是什么?

JavaScript
function changeValue(x) {
    x = 10;
}
let a = 5;
changeValue(a);
console.log(a);
A

5

B

10

C

undefined

D

报错

6

以下哪种方式可以定义一个 JavaScript 函数?

A

var fn = new Function('a', 'b', 'return a + b');

B

function fn = (a, b) => { return a + b; }

C

def fn(a, b) { return a + b; }

D

fn(a, b) -> { return a + b; }

7

以下哪个箭头函数语法是正确的?

A

const fn = (x) => { return x * 2 };

B

const fn = x => x * 2;

C

const fn = (x, y) => x + y;

D

以上都正确

8

以下代码输出结果是什么?

JavaScript
console.log(a);
console.log(b);
var a = 1;
let b = 2;
A

undefined, 2

B

1, 2

C

undefined, ReferenceError

D

ReferenceError, ReferenceError

9

以下代码输出结果是什么?

JavaScript
console.log(foo);
console.log(bar);
function foo() { return 1; }
var bar = function() { return 2; };
A

function foo(){ return 1; }, undefined

B

function foo(){ return 1; }, function bar(){ return 2; }

C

undefined, undefined

D

ReferenceError, ReferenceError

10

以下代码输出结果是什么?

JavaScript
for (var i = 0; i < 3; i++) {
    setTimeout(function() {
        console.log(i);
    }, 100);
}
A

0, 1, 2

B

3, 3, 3

C

undefined, undefined, undefined

D

0, 0, 0

11

以下代码输出结果是什么?

JavaScript
function createCounter() {
    let count = 0;
    return function() {
        return ++count;
    };
}
let counter = createCounter();
console.log(counter());
console.log(counter());
A

0, 0

B

1, 1

C

1, 2

D

undefined, undefined

12

以下代码输出结果是什么?

JavaScript
const obj = {
    name: 'test',
    fn: () => console.log(this.name),
    fn2: function() { console.log(this.name); }
};
obj.fn();
obj.fn2();
A

test, test

B

undefined, test

C

test, undefined

D

undefined, undefined

多选题
13

关于 JavaScript 变量声明,以下说法正确的是?

A

var 声明的变量具有函数作用域

B

let 声明的变量具有块级作用域

C

const 声明的变量必须初始化

D

var 声明的变量可以重复声明

14

关于闭包,以下说法正确的是?

A

闭包可以访问外部函数的变量

B

闭包会保持对外部变量的引用,可能导致内存泄漏

C

闭包常用于数据私有化和函数工厂

D

闭包只能在函数内部创建

15

以下哪些方式可以正确解决 for 循环中 setTimeout 输出 0,1,2 的问题?

JavaScript
for (var i = 0; i < 3; i++) {
    setTimeout(function() { console.log(i); }, 100);
}
A

将 var 改为 let

B

使用 setTimeout 的第三个参数传递 i

C

使用 IIFE 包裹并传入 i

D

在回调函数内部声明新的变量

填空题
16

在函数内部,可以使用 ____________ 对象访问所有传入的参数;ES6 中使用 ____________ 剩余参数语法收集多余参数,剩余参数是一个真正的 ____________

17

闭包由 ____________ 和其 ____________ 组成。闭包使得内部函数可以访问 ____________ 的变量,即使外部函数已经 执行完毕。

18

箭头函数使用 ____________ 符号定义,它没有自己的 ____________,继承自 ____________。箭头函数不能用作 构造函数,因为没有 prototype 属性。

19

JavaScript 有三种作用域:____________________________________。var 声明的变量会提升到 函数作用域 顶部,let 和 const 声明的变量存在 暂时性死区。

20

使用函数声明定义名为 add 的函数,语法为 ____________;使用函数表达式定义,语法为 ____________

参考答案
1.正确 2.正确 3.正确 4.B 5.A 6.A 7.D 8.C 9.A 10.B 11.C 12.B 13.A;B;C;D 14.A;B;C 15.A;B;C 16.arguments;...args;数组 17.函数;词法环境;外部函数 18.=>;this;外层作用域 19.全局作用域;函数作用域;块级作用域 20.function add(a, b){ return a + b };var add = function(a, b){ return a + b }
想在手机上练习这套专题?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一个专题 JS DOM操作与事件
下一个专题 → JS 原型链与继承
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码