函数的概念与作用

函数是程序中的一种基本结构,它允许我们把一组代码封装成一个独立的单位,并通过特定的名称调用这个单元。函数的作用主要有以下几点:

提高代码复用性: 将重复或相似的操作封装到一个函数中,可以避免代码冗余。
增强逻辑清晰度: 通过将具体操作抽象为函数,可以更清楚地表达程序的功能。
组织代码结构: 复杂的逻辑可以通过多个函数的调用来实现。

函数的基本定义

在JavaScript中,函数可以通过function关键字定义。一个基本的函数定义如下:

1
2
3
function functionName() {
// 函数体内的操作代码
}

示例:

1
2
3
function greet(name) {  // 定义一个接受参数 `name` 的函数
console.log(`Hello, ${name}`); // 执行特定操作
}

函数的调用

一旦定义了一个函数,就可以通过调用来执行其中的操作。调用方式如下:

1
greet("Alice");  // 调用 `greet` 函数,并传递参数 `"Alice"`

注意事项:

必须在函数定义之前调用函数。
调用时可以不提供参数(如果函数没有默认参数),但必须遵循函数的定义。
函数的作用域与变量

JavaScript中的函数属于全局作用域,这意味着函数体内使用的变量会被视为全局变量。不过,为了更好地管理代码,我们可以使用以下方法:

使用括号()强制调用: 这可以避免某些特殊情况下全局作用域的识别。

1
2
3
(function greet(name)) {  // 使用括号强制调用函数
console.log(`Hello, ${name}`);
}

明确指定作用域: 使用const或let关键字定义变量时,可以指定其作用域。

函数的参数与返回值
参数传递
函数可以通过接受参数来接收外部的数据。例如:

1
2
3
function greet(name) {
console.log(`Hello, ${name}`);
}

调用时:

1
greet("Alice");  // 输出: "Hello, Alice"

如果函数没有定义参数,也可以直接调用:

1
greet();  // 输出: "Hello, "

返回值
JavaScript的默认返回值是undefined。要让函数返回特定值,可以使用return关键字。

示例:

1
2
3
function multiply(a, b) {
return a * b; // 返回两个数相乘的结果
}

调用时:

1
2
let result = multiply(3, 4);  // 结果为 `12`
console.log(result); // 输出: "12"

函数的高级特性
除了基本功能,JavaScript还支持一些更高级的功能:

  1. 默认参数
    可以在函数定义中为参数提供默认值。
1
2
3
function greet(name = "World") {  // 如果没有传递参数,则 `name` 的值为 `"World"`
console.log(`Hello, ${name}`);
}

调用时:

调用一次,不传参数:

1
greet();  // 输出: "Hello, World"

调用两次,传参数:

1
greet("Alice");  // 输出: "Hello, Alice"
  1. 可选参数
    可以定义函数接受任意数量的参数。

使用…args接收多余参数。

1
2
3
function acceptAnyArgs(...args) {
console.log(args.length + ' arguments passed');
}

调用时:

1
acceptAnyArgs(1, 2, 3);  // 输出: "3 arguments passed"
  1. 函数的表达式形式
    可以将函数直接写成一个表达式:
1
2
let multiply = (a, b) => a * b;  // 定义一个乘法函数
console.log(multiply(2, 3)); // 输出: 6
  1. 闭包
    闭包是指一个函数在执行过程中能够访问外部变量或内部变量的技术。
1
2
3
4
5
6
7
8
9
function outer(x) {
function inner(n) { // 内部函数可以访问 `x`
return x + n;
}
return inner;
}

let result = outer(5)(3); // 输出: "8"
console.log(result); // 输出: undefined (因为 result 已被赋值,实际应输出 "8")

函数的常见使用场景
处理重复任务

如果需要多次执行相同的操作,可以通过函数将代码封装起来。
数据转换

对输入数据进行某种变换或计算,例如排序、统计等。
异步操作

使用 Promises 或 async/await关键字时,通常会定义为 async function 并使用await关键字调用。
模块化代码

将逻辑拆分成多个函数,使得代码更易维护。
总结
函数是 JavaScript 编程中非常重要的基础概念。掌握如何定义和调用函数,能够显著提高代码的可读性和复用性。通过理解函数的基本知识和高级特性,你可以更好地编写高效的代码。

匿名函数的基本概念
匿名函数可以用来解决以下几种情况:

不需要为函数命名:当一个函数只需要在非常短的时间内使用时,没有必要定义一个命名函数。
避免名称冲突:通过不定义名字,可以避免与其他函数或变量产生命名冲突。
处理回调函数:匿名函数特别适合用于处理需要传递的回调函数(Callback)。
匿名函数的语法
匿名函数可以通过以下两种方式定义:

  1. 使用 function 关键字
    最传统的定义匿名函数的方式是使用 function 关键字:
1
2
3
const greeting = function(name) {
console.log(`Hello, ${name}`);
};

这里的 greeting 函数是一个匿名函数,没有名称。

  1. 使用 ES6 引擎的箭头函数语法
    现代 JavaScript 提供了一种更简洁的方式来定义匿名函数,这就是 ES6 引入的 箭头函数(arrow function):
1
2
3
const greeting = (name) => {
console.log(`Hello, ${name}`);
};

匿名函数的优势
无需声明函数名称:匿名函数不需要为函数起名字,因此可以避免命名冲突。
灵活性高:匿名函数可以立即定义并执行,适合处理复杂或动态生成的逻辑。
安全:匿名函数不会污染命名空间,避免全局变量的使用问题。
匿名函数的常见用途
回调函数:

1
2
3
4
5
const func = (a, b) => {
console.log(`The sum is ${a + b}`);
};

const result = func(3, 5); // 输出:8

处理函数参数的默认值:

1
2
3
4
5
6
const add = (a, b=0) => {
return a + b;
};

console.log(add(2)); // 输出:2
console.log(add(2, 3)); // 输出:5

匿名函数的命名空间问题
因为匿名函数没有显式的名称,所以在 declare 语句中不会被记录到命名空间中。它们会被执行时的当前作用域所隔离。

1
2
3
4
5
6
7
8
9
10
11
12
13
function outer() {
console.log('Outer function: ' + outer2); // 报错:Cannot read property 'outer2' of null

function inner() {
console.log('Inner function: ' + inner.name); // 报错:Cannot read property 'name' of null
}

const anonymous = function() {
console.log('Anonymous function: ' + (anonymous.name || 'No name'));
};
}

anonymous = outer(); // 输出:Anonymous function: No name

总结
匿名函数 是一种非常灵活且有用的工具,特别适合在处理回调函数或需要临时定义的函数时使用。
使用箭头函数可以让匿名函数更简洁、高效。
匿名函数不会污染命名空间,因此在复杂的场景中可以更好地控制作用域问题。

对象

理解对象的概念:

对象是将多种数据以键值对的形式封装在一起的数据结构。例如,学生对象包含了学号、姓名和成绩等信息。
创建对象的方法:

使用大括号初始化:const obj = { name: “张三”, age: 18 };
键必须在值前面,以区分键名和值,并确保语法正确。
增删查改操作:

增:

使用 obj[newKey] = value; 来添加新属性。例如:person.name = “小明”;
查:

直接访问属性:obj.keyName
引用访问属性:obj[‘keyName’],后者更灵活,适用于字符串键名的变更。
删:

使用 delete obj[key]; 或者 obj[key] = undefined; 来删除属性。删除后需重新赋值以恢复属性。
改:

直接赋值:obj[key] = value
赋值新对象:obj[key] = { … }; 适用于嵌套结构。
实例应用:

1
2
3
4
5
6
7
8
9
const student = {
name: "张三",
age: 18,
score: [90, 85, 76]
};
console.log(student.name); // 输出:张三
delete student.score;
console.log(student.score); // 输出:undefined
student.address = { street: "北京", house: "东直门" };