JavaScript函数与方法详解
目录
一、函数的定义
1. 函数声明
2. 函数表达式
3. 箭头函数
二、函数的调用
1. 调用方式
2. 参数数量的灵活性
三、arguments 对象
1. 基本概念
2. 属性
3. 应用场景
4. 转换为真数组
5. 总结
四、Rest参数
1. 基本概念
2. 特点
3. 应用场景
4. 总结
五、变量的作用域
1. 全局作用域
2. 局部作用域
3. 块级作用域
4. let与const
六、方法
1. 方法定义与调用
2. apply方法
在JavaScript中,函数和方法是执行特定任务的代码块,尽管它们在很多方面相似,但存在一些关键差异,主要体现在它们如何被定义和调用上。
一、函数的定义
在JavaScript中,函数可以通过多种方式定义,包括函数声明、函数表达式和箭头函数等。
1. 函数声明
函数声明使用function关键字定义,具有函数名和参数列表,并以分号结束。
function add(a, b) {return a + b;}console.log(add(3, 5)); // 输出:8
函数声明的特点是无论在何处调用,都会从头开始执行。
2. 函数表达式
函数表达式将函数赋值给一个变量,可以是匿名函数或命名函数。
const add = function (a, b) {return a + b;};console.log(add(3, 5)); // 输出:8
函数表达式可以在任何地方定义和调用。
3. 箭头函数
箭头函数提供了更简洁的语法,减少了代码量。
const add = (a, b) => a + b;console.log(add(3, 5)); // 输出:8
箭头函数不仅提供了更简洁的语法,还解决了传统函数中 this 指向问题,使代码更加清晰和易于维护。
二、函数的调用
1. 调用方式
调用函数很简单,只需使用函数名并传递必要的参数。
console.log(add(3, 3)); // 输出: 6
2. 参数数量的灵活性
JavaScript对函数的参数数量使用非常灵活。如果传递的参数过多,多余的部分会被忽略;如果传递的参数过少,缺失的参数将被赋值为undefined。
function add(a, b) {return a + b;}console.log(add(3, 3, 3)); // 输出:6console.log(add(3)); // 输出:NaN
三、arguments 对象
1. 基本概念
arguments 对象是 JavaScript 中所有非箭头函数的局部变量,用于存储传递给函数的参数。它是一个类数组对象,具有 length 属性,索引从 0 开始,但没有 Array 的内置方法如 forEach() 和 map()。arguments 对象可以通过 Array.prototype.slice.call(arguments) 或 Array.from(arguments) 转换为真正的 Array,但不支持 pop() 等方法。当调用的参数多于函数正式声明的参数时,arguments 对象可以用来处理可变数量的参数。
2. 属性
-
arguments.callee:指向当前执行的函数。 -
arguments.length:表示传递给函数的参数数量。 -
arguments[Symbol.iterator]:返回一个数组迭代器对象,包含参数中每个索引的值。
3. 应用场景
arguments 对象常用于处理可变数量的参数、递归操作等场景。例如,在递归函数中,可以通过 arguments.callee 获取当前函数引用,从而实现递归计算。
以下是使用 arguments 对象的示例代码:
// 打印元素function printArgs() {for (let i = 0; i < arguments.length; i++) {console.log(arguments[i]);}}printArgs(1, 'hello', true); // 输出:1 hello true// 求和function sum() {let total = 0;for (let i = 0; i < arguments.length; i++) {total += arguments[i];}return total;}console.log(sum(1, 2, 3)); // 输出:6// 递归计算阶乘function factorial(num) {if (num <= 1) {return 1;} else {return num * arguments.callee(num - 1);}}console.log(factorial(5)) // 输出:120
4. 转换为真数组
虽然 arguments 对象不直接支持数组方法,但可以通过 Function.call 间接调用,将 arguments 转换为数组:
function convertToArray() {return Array.prototype.slice.call(arguments);}console.log(convertToArray(1, 2, 3)); // 输出:[1, 2, 3]
5. 总结
arguments 对象是 JavaScript 中一个强大的工具,用于处理函数调用时的参数信息。尽管它不是真正的数组,但通过一些技巧可以将其转换为数组,并利用其特性来编写灵活的函数。然而,在现代 JavaScript 中,推荐使用剩余参数(rest parameters)来替代 arguments 对象,因为剩余参数提供了更好的可读性和功能。
四、Rest参数
1. 基本概念
JavaScript中的Rest参数(Rest Parameters)是ES6(ECMAScript 2015)引入的一个重要特性,用于处理函数中不定数量的参数。Rest参数允许开发者定义一个函数,使其能够接收任意数量的参数,并将这些参数收集到一个数组中。这种语法通过在参数列表末尾添加三个点(...)来实现。例如:
function myFunction(a, b, ...args) {console.log(a); // 输出第一个参数console.log(b); // 输出第二个参数console.log(args); // 输出剩余的所有参数,组成一个数组}myFunction(1, 2, 3, 4, 5); // 输出:1, 2, [3, 4, 5]
在本例中,...args会收集所有未命名的额外参数,并将其存储为一个数组。
2. 特点
-
只能出现在参数列表的最后:Rest参数必须是最后一个参数,不能与其他命名参数混合使用。
function f(x, ...y, z) { } // 报错:Uncaught SyntaxError: Rest parameter must be last formal parameter.
-
返回值是一个数组:Rest参数总是返回一个数组,即使没有传递额外的参数,它也会返回一个空数组。
function f(x, ...y) {console.log(y);}f(1); // 输出:[]
-
与
arguments对象的区别:Rest参数是一个真正的数组,而arguments对象是一个类数组对象,不支持数组方法如sort()、map()等。 -
只能使用一次:一个函数只能有一个Rest参数,且必须是最后一个参数。
3. 应用场景
Rest参数在处理不定数量的参数时非常有用,例如计算总和、合并数组、解构赋值等。
// 计算总和function sum(...numbers) {return numbers.reduce((acc, curr) => acc + curr, 0);}console.log(sum(1, 2, 3, 4)); // 输出:10// 合并数组function mergeArrays(...arrays) {return arrays.reduce((acc, curr) => acc.concat(curr), []);}console.log(mergeArrays([1, 2], [3, 4], [5])); // 输出:[1, 2, 3, 4, 5]// 解构赋值const [a, b, ...rest] = [1, 2, 3, 4];console.log(rest); // 输出:[3, 4]
4. 总结
Rest参数是JavaScript中处理不定数量参数的强大工具,它简化了函数定义和调用的复杂性。通过将多余的参数收集到一个数组中,开发者可以更方便地操作这些参数。Rest参数与扩展运算符的结合使用,进一步增强了其灵活性和实用性。
五、变量的作用域
JavaScript中的变量作用域分为全局作用域和局部作用域。
1. 全局作用域
全局作用域是指在所有函数之外定义的变量,其作用域范围是同一个页面文件中的所有脚本,可以在任何地方使用,直到页面关闭。
const globalVar = 'I am global!';console.log(globalVar); // 输出:"I am global!"
2. 局部作用域
局部作用域是指在函数内部声明的变量,仅在该函数及其嵌套函数中有效,不能在函数外部访问。
function test() {const localVar = 'I am local!';console.log(localVar);}test(); // 输出:"I am local!"console.log(localVar); // 报错:Uncaught ReferenceError: localVar is not defined.
3. 块级作用域
ES6 引入了 let 和 const 关键字,它们提供了块级作用域(如if语句、for循环等)。使用 let 或 const 声明的变量只在块级中可用。
if (true) {let blockScopeVar = 1;const blockScopeConst = 2;}console.log(blockScopeVar); // 报错:Uncaught ReferenceError: blockScopeVar is not defined.console.log(blockScopeConst); // 报错:Uncaught ReferenceError: blockScopeConst is not defined.
4. let与const
-
let:声明一个块作用域的局部变量,可以重新赋值。
-
const:声明一个块作用域的常量,一旦赋值就不能重新赋值(但如果是对象或数组,其内容仍然可以修改)。
const PI = 3.14;PI = 3.14159; // 报错:Uncaught TypeError: Assignment to constant variable.
六、方法
JavaScript 方法(methods)是定义在对象中的函数,可以通过对象调用,用于执行特定任务或操作。这些方法可以是对象自带的,也可以是我们自定义的。
1. 方法定义与调用
const person = {name: 'Tom',// 定义方法greet: function () {console.log(`Hello, my name is ${this.name}!`);}};// 调用方法person.greet(); // 输出:"Hello, my name is Tom!"
2. apply方法
apply 方法是 JavaScript 中 Function.prototype 的一个方法,允许我们在指定的上下文(即 this 值)中调用一个函数,并且可以传递一个参数数组作为函数的参数列表。apply 方法的第一个参数是 this 的值,第二个参数是一个数组或类数组对象,包含了将要传递给函数的参数。
function greet(greeting, name) {console.log(greeting + ", " + name + "!");}const person = {name: "Tom"};// 使用apply调用greet函数,设置this为person对象,并以数组形式提供参数。greet.apply(person, ["Hello", person.name]); // 输出: Hello, Tom!
与apply类似的call方法允许我们调用一个函数,设置this的值,并直接提供参数列表。
function greet(greeting, name) {console.log(greeting + ", " + name + "!");}const person = {name: "Tom"};greet.call(person, "Hi", person.name); // 输出: Hi, Tom!相关文章:
JavaScript函数与方法详解
目录 一、函数的定义 1. 函数声明 2. 函数表达式 3. 箭头函数 二、函数的调用 1. 调用方式 2. 参数数量的灵活性 三、arguments 对象 1. 基本概念 2. 属性 3. 应用场景 4. 转换为真数组 5. 总结 四、Rest参数 1. 基本概念 2. 特点 3. 应用场景 4. 总结 五、变…...
【论文笔记】ZeroGS:扩展Spann3R+GS+pose估计
spann3r是利用dust3r做了增量式的点云重建,这里zeroGS在前者的基础上,进行了增量式的GS重建以及进行了pose的联合优化,这是一篇dust3r与GS结合的具有启发意义的工作。 abstract NeRF和3DGS是重建和渲染逼真图像的流行技术。然而,…...
AtCoder - arc058_d Iroha Loves Strings解答与注意事项
链接:Iroha Loves Strings - AtCoder arc058_d - Virtual Judge 利用bitset这一数据结构,定义bitset类型的变量dp[i]表示第i到n个字符串能拼成的字符串长度都有哪些,比如00100101,表示能拼成的长度有0,2,5,࿰…...
企业使用统一终端管理(UEM)工具提高端点安全性
什么是统一终端管理(UEM) 统一终端管理(UEM)是一种从单个控制台管理和保护企业中所有端点的方法,包括智能手机、平板电脑、笔记本电脑、台式机和 IoT设备。UEM 解决方案为 IT 管理员提供了一个集中式平台,用于跨所有作系统和设备类型部署、配置、管理和…...
Leetcode 算法题 9 回文数
起因, 目的: 数学法。 % 求余数, 拆开组合,组合拆开。 这个题,翻来覆去,拆开组合, 组合拆开。构建的过程。 题目来源,9 回文数: https://leetcode.cn/problems/palindrome-number…...
设计模式Python版 命令模式(上)
文章目录 前言一、命令模式二、命令模式示例 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式:关注类和对象之间的组合&…...
C语言之循环结构:直到型循环
C语言 循环结构 直到型循环的实现 特点:先执行,后判断,不管条件是否满足,至少执行一次。典型代表:do…while,goto(已淘汰,不推荐使用) do…while 语法: d…...
细说STM32F407单片机RTC的备份寄存器原理及使用方法
目录 一、备份寄存器的功能 二、示例功能 三、项目设置 1、晶振、DEBUG、CodeGenerator、USART6 2、RTC 3、NVIC 4、GPIO 及KEYLED 四、软件设计 1、main.h 2、main.c 3、rtc.c 4、keyled.c、keyled.h 五、运行调试 本实例旨在介绍备份寄存器的作用。本实例继续使…...
MATLAB计算反映热需求和能源消耗的度数日指标(HDD+CDD)(全代码)
目录 度数日(Degree Days, DD)概述计算公式MATLAB计算代码调用函数1:计算单站点的 CDD参考度数日(Degree Days, DD)概述 度数日(Degree Days, DD)是用于衡量建筑、城市和地区的热需求和能源消耗模式的指标。它分为两部分: 加热度日(Heating Degree Days, HDD):当室…...
J6 X8B/X3C切换HDR各帧图像
1、OV手册上的切换命令 寄存器为Ox5074 各帧切换: 2、地平线control tool实现切换命令 默认HDR模式出图: HCG出图: LCG出图 SPD出图 VS出图...
09-轮转数组
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 方法一:使用额外数组 function rotate(nums: number[], k: number): void {const n nums.length;k k % n; // 处理 k 大于数组长度的情况const newNums new A…...
用vue3写一个好看的wiki前端页面
以下是一个使用 Vue 3 Element Plus 实现的 Wiki 风格前端页面示例,包含现代设计、响应式布局和常用功能: <template><div class"wiki-container"><!-- 头部导航 --><el-header class"wiki-header"><d…...
瑞芯微烧写工具
文章目录 前言一、安装驱动二、安装烧写工具1.直接解压压缩包2. 如何使用 三、MASKROM 裸机必备四、LOADER 烧写,前提是搞过第三步没问题五、Update.img包的烧录六、linux下烧写总结 前言 提示:这里可以添加本文要记录的大概内容: 项目需要…...
说下JVM中一次完整的GC流程?
大家好,我是锋哥。今天分享关于【说下JVM中一次完整的GC流程?】面试题。希望对大家有帮助; 说下JVM中一次完整的GC流程? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 JVM中的一次完整的垃圾回收(GC)流程可以概括为…...
Open FPV VTX开源之OSD使用分类
Open FPV VTX开源之OSD使用分类 1. 源由2. 硬件2.1 【天空端】SigmaStar2.2 【天空端】Raspberry Pi2.3 【地面端】 3. 软件3.1 天空端软件3.2 地面端软件 4. 分类4.1 嵌入式OSD分类A1-嵌入式OSD:SigmaStar Android分类A2-嵌入式OSD:SigmaStar Hi3536分…...
智慧农业-虫害及生长预测
有害生物防控系统是一个综合性的管理体系,旨在预防和控制对人类生活、生产甚至生存产生危害的生物。这些生物可能包括昆虫、动物、植物、微生物乃至病毒等。 一、系统构成 1、监测预警系统:利用智能传感器、无人机、遥感技术等手段,实时监测…...
Python 识别图片和扫描PDF中的文字
目录 工具与设置 Python 识别图片中的文字 Python 识别图片中的文字及其坐标位置 Python 识别扫描PDF中的文字 注意事项 在处理扫描的PDF和图片时,文字信息往往无法直接编辑、搜索或复制,这给信息提取和分析带来了诸多不便。手动录入信息不仅耗时费…...
C语言如何知道当前系统中的编译器数据类型的大小是多少?
在 C 语言中,你可以使用sizeof运算符来确定当前系统中编译器数据类型的大小,该运算符返回一个size_t类型的值,表示所操作对象或数据类型占用的字节数。下面为你详细介绍使用方法: 1. 基本数据类型大小的获取 基本数据类型如char…...
gitlab Webhook 配置jenkins时“触发远程构建 (例如,使用脚本)”报错
报错信息: <html> <head> <meta http-equiv"Content-Type" content"text/html;charsetISO-8859-1"/> <title>Error 403 No valid crumb was included in the request</title> </head> <body><h2…...
Mysql中使用sql语句生成雪花算法Id
🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
高考志愿填报管理系统---开发介绍
高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发,采用现代化的Web技术,为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## 📋 系统概述 ### 🎯 系统定…...
leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...
理想汽车5月交付40856辆,同比增长16.7%
6月1日,理想汽车官方宣布,5月交付新车40856辆,同比增长16.7%。截至2025年5月31日,理想汽车历史累计交付量为1301531辆。 官方表示,理想L系列智能焕新版在5月正式发布,全系产品力有显著的提升,每…...
spring中的@KafkaListener 注解详解
KafkaListener 是 Spring Kafka 提供的一个核心注解,用于标记一个方法作为 Kafka 消息的消费者。下面是对该注解的详细解析: 基本用法 KafkaListener(topics "myTopic", groupId "myGroup") public void listen(String message)…...
