当前位置:首页 > 技术 > 正文内容

JavaScript 函数深入解析

访客 技术 2026年6月15日 1

核心概念速览

  • 函数是JS中可重复调用的代码片段,用于执行任务或计算值。
  • 定义方式包括声明式(function fn() {})和表达式式(const fn = function() {})。
  • 支持默认参数、剩余参数及箭头函数语法。
  • 函数拥有独立作用域,内部声明的变量外部无法访问。
  • 闭包机制使函数能"记住"并访问其外部作用域的变量。
  • 箭头函数语法简洁,且不绑定自身的 this

如何定义函数

在JavaScript中,函数是一等公民,意味着它们可以像变量一样被传递、赋值和返回。主要有三种定义方式:

1. 函数声明

最常见的写法,使用 function 关键字。

function square(number) {
  return number * number;
}

特性:会被提升(hoisting),可以在声明前调用。例如:

console.log(square(5)); // 输出 25
function square(n) { return n * n; }

2. 函数表达式

将函数赋值给一个变量。可以是匿名函数,也可以有名字(用于递归)。

const square = function(n) {
  return n * n;
};

// 命名函数表达式
const factorial = function fact(n) {
  return n < 2 ? 1 : n * fact(n - 1);
};

特性:不会被提升,必须在定义之后才能调用。

3. 自执行函数 (IIFE)

定义后立即执行的函数表达式,常用于创建独立作用域。

(function() {
  var message = "Hello, IIFE!";
})();

参数与返回值

参数传递规则

基础类型(string, number, boolean)按值传递;对象和数组按引用传递,修改会影响原数据。

function changeObj(obj) {
  obj.brand = "Toyota";
}
var mycar = { brand: "Honda" };
changeObj(mycar);
console.log(mycar.brand); // 输出 "Toyota"

默认参数 (ES6)

function multiply(a, b = 1) {
  return a * b;
}
console.log(multiply(5)); // 5

剩余参数 (Rest Parameters)

function sum(...args) {
  return args.reduce((acc, cur) => acc + cur, 0);
}
console.log(sum(1, 2, 3, 4)); // 10

返回值

使用 return 语句返回结果。如果没有 return,函数默认返回 undefined

function noOp() {}
console.log(noOp()); // undefined

作用域与闭包

作用域

函数内部的变量是局部变量,外部无法访问。

function showCar() {
  var car = "Volvo";
  console.log(car); // "Volvo"
}
showCar();
// console.log(car); // 报错:car is not defined

闭包

闭包是函数与其词法环境的组合。内部函数可以访问外部函数的变量,即使外部函数已经执行完毕。

function createCounter() {
  let count = 0;
  return function() {
    count++;
    return count;
  };
}
const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2

闭包常用于数据封装和保持状态。

箭头函数 (Arrow Functions)

ES6 引入的简洁语法,特别是对于简单操作和回调函数。箭头函数没有自己的 this,它会捕获所在上下文的 this 值。

// 单参数,省略括号
const double = x => x * 2;

// 无参数,需要空括号
const sayHello = () => console.log("Hello");

// 多参数,需要括号
const add = (a, b) => a + b;

// 函数体多行,需要花括号和 return
const getPerson = (name, age) => {
  return { name: name, age: age };
};

箭头函数不能被用作构造函数,也没有 arguments 对象(可使用剩余参数替代)。

高级特性

函数作为一等公民

函数可以被赋值给变量、作为参数传递、作为返回值返回。

function operate(a, b, callback) {
  return callback(a, b);
}
const result = operate(5, 3, (x, y) => x + y);
console.log(result); // 8

递归

函数调用自身,常用于解决树形结构、阶乘等问题。

function factorial(n) {
  if (n === 0) return 1;
  return n * factorial(n - 1);
}
console.log(factorial(5)); // 120

注意:深度递归可能导致栈溢出,本文未讨论尾调用优化等优化手段。

内置全局函数

JavaScript 提供了一些内置函数,例如 parseInt(), isNaN(), encodeURI(), eval() 等。需要注意的是,eval() 有安全风险,应避免使用。

总结对比

特性函数声明函数表达式箭头函数
提升
this 绑定动态动态静态(词法)
作为构造函数可以可以不可以
arguments 对象无(可用 rest)
语法简洁度标准标准简洁

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。