JavaScript的函数介绍

文章目录

  • [1. 定义函数的四种方式](#1. 定义函数的四种方式)
    • [函数声明(Function Declaration)](#函数声明(Function Declaration))
    • [函数表达式(Function Expression)](#函数表达式(Function Expression))
    • [箭头函数(Arrow Function,ES6)](#箭头函数(Arrow Function,ES6))
    • [用 Function 构造函数(很少用)](#用 Function 构造函数(很少用))
  • [2. 参数:更灵活的处理方式](#2. 参数:更灵活的处理方式)
  • [3. 返回值](#3. 返回值)
  • [4. 作用域与闭包(非常重要)](#4. 作用域与闭包(非常重要))
  • [5. this 的指向](#5. this 的指向)
  • [6. 高阶函数与回调](#6. 高阶函数与回调)
  • [7. 立即执行函数(IIFE)](#7. 立即执行函数(IIFE))
  • [8. 其他现代函数形式](#8. 其他现代函数形式)

JavaScript 中的函数是一等公民,它不仅是封装代码、复用的基本单元,更是一种对象。

1. 定义函数的四种方式

函数声明(Function Declaration)

会被提升,可以在定义前调用。

bash 复制代码
function greet(name) {
  return 'Hello, ' + name;
}

函数表达式(Function Expression)

将函数赋值给变量,不会被提升。

c 复制代码
const greet = function(name) {
  return 'Hello, ' + name;
};

箭头函数(Arrow Function,ES6)

写法更简洁,且不绑定自己的 this、arguments。

bash 复制代码
const greet = (name) => 'Hello, ' + name;
// 多个语句需要用 {} 和 return
const sum = (a, b) => {
  const result = a + b;
  return result;
};

用 Function 构造函数(很少用)

bash 复制代码
const greet = new Function('name', 'return "Hello, " + name');

2. 参数:更灵活的处理方式

默认参数

bash 复制代码
function greet(name = '访客') {
  return `你好,${name}`;
}
greet(); // "你好,访客"

arguments 对象

在非箭头函数中可用,是一个类数组对象,包含所有传入的参数。

bash 复制代码
function oldStyle() {
  for (var i = 0; i < arguments.length; i++) {
    console.log(arguments[i]);
  }
}
oldStyle('Hello', 'World', 3); 

3. 返回值

函数默认返回 undefined,用 return 可以返回任意值(包括另一个函数)。

bash 复制代码
function noReturn() {}
noReturn(); // undefined

4. 作用域与闭包(非常重要)

函数在创建时,会记住自己所在的作用域,形成闭包。

bash 复制代码
function createCounter() {
  let count = 0; // 这个变量被内部函数"记住"了
  return function() {
    count += 1;
    return count;
  };
}

const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2 --- 说明 count 仍然存活

闭包是实现模块化、数据私有的基础。

5. this 的指向

this 的值取决于函数的调用方式,而非定义方式。

bash 复制代码
const user = {
  name: 'Alice',
  sayName: function() {
    console.log(this.name);
  },
  sayArrow: () => {
    console.log(this.name); // this 指向 window/全局
  }
};
user.sayName(); // 'Alice'
user.sayArrow(); // undefined(视环境而定)

6. 高阶函数与回调

函数可以作为参数传递,或作为返回值------这就是高阶函数。

以下使用到了闭包。

bash 复制代码
// 回调函数
setTimeout(() => console.log('tick'), 1000);

// 数组方法的回调
const doubled = [1, 2, 3].map(x => x * 2); // [2,4,6]

// 返回函数的函数
function multiplyBy(factor) {
  return function(number) {
    return number * factor;
  };
}
const double = multiplyBy(2);
double(5); // 10

7. 立即执行函数(IIFE)

定义后立即执行,常用于创建独立作用域。

bash 复制代码
(function() {
  var secret = 'IIFE';
  console.log(secret);
})(); // 输出 IIFE,外部无法访问 secret

8. 其他现代函数形式

生成器函数 function*:可暂停和恢复,通过 yield 逐步产出值。

异步函数 async function:返回 Promise,用 await 等待异步结果,代码更像同步。

bash 复制代码
async function fetchData() {
  const res = await fetch('/api');
  return res.json();
}
相关推荐
问心无愧05132 分钟前
ctf show web 178
前端·笔记
岁岁种桃花儿5 分钟前
Vue组件化编程第二篇:非单位件组件
前端·javascript·vue.js
晓得迷路了8 分钟前
栗子前端技术周刊第 146 期 - React 19.3、jQuery 1.0 20 周年、Bun 1.4.2...
前端·javascript·react.js
雪芽蓝域zzs9 分钟前
第四十四节:封装通用表格多选、批量操作组合式函数
前端·javascript·vue.js
ljt27249606619 分钟前
Vue笔记--路由
javascript·vue.js·笔记
敲代码的嘎仔10 分钟前
互动问答系统实战:两级评论模型、ES 搜索集成、Caffeine 多级缓存全记录
java·开发语言·数据库·elasticsearch·缓存·mybatis·高并发
yujunl12 分钟前
找不到指定的SDK(“Microsoft.NET.Sdk.Web“)
开发语言
那年窗外下的雪.13 分钟前
AIDC 学习日志|第 25 天|设备输出反推、MAC Flapping 与 EAD 撤销
前端·网络·git·学习·macos
IT_陈寒13 分钟前
Vite的HMR怎么突然罢工了?原来是我漏了这个配置
前端·人工智能·后端
柳杉24 分钟前
从调研到闭环,我用 GPT-Image-2.5 和 GPT-6 Astra 把智慧厂房 3D 大屏这条链路走完了
前端·ai编程·数据可视化