当前位置: 首页 > news >正文

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 引入了 letconst 关键字,它们提供了块级作用域(如if语句、for循环等)。使用 letconst 声明的变量只在块级中可用。

 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. letconst

  • 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做了增量式的点云重建&#xff0c;这里zeroGS在前者的基础上&#xff0c;进行了增量式的GS重建以及进行了pose的联合优化&#xff0c;这是一篇dust3r与GS结合的具有启发意义的工作。 abstract NeRF和3DGS是重建和渲染逼真图像的流行技术。然而&#xff0c;…...

AtCoder - arc058_d Iroha Loves Strings解答与注意事项

链接&#xff1a;Iroha Loves Strings - AtCoder arc058_d - Virtual Judge 利用bitset这一数据结构&#xff0c;定义bitset类型的变量dp[i]表示第i到n个字符串能拼成的字符串长度都有哪些&#xff0c;比如00100101&#xff0c;表示能拼成的长度有0,2,5&#xff0c;&#xff0…...

企业使用统一终端管理(UEM)工具提高端点安全性

什么是统一终端管理(UEM) 统一终端管理(UEM)是一种从单个控制台管理和保护企业中所有端点的方法&#xff0c;包括智能手机、平板电脑、笔记本电脑、台式机和 IoT设备。UEM 解决方案为 IT 管理员提供了一个集中式平台&#xff0c;用于跨所有作系统和设备类型部署、配置、管理和…...

Leetcode 算法题 9 回文数

起因&#xff0c; 目的: 数学法。 % 求余数&#xff0c; 拆开组合&#xff0c;组合拆开。 这个题&#xff0c;翻来覆去&#xff0c;拆开组合&#xff0c; 组合拆开。构建的过程。 题目来源&#xff0c;9 回文数&#xff1a; https://leetcode.cn/problems/palindrome-number…...

设计模式Python版 命令模式(上)

文章目录 前言一、命令模式二、命令模式示例 前言 GOF设计模式分三大类&#xff1a; 创建型模式&#xff1a;关注对象的创建过程&#xff0c;包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式&#xff1a;关注类和对象之间的组合&…...

C语言之循环结构:直到型循环

C语言 循环结构 直到型循环的实现 特点&#xff1a;先执行&#xff0c;后判断&#xff0c;不管条件是否满足&#xff0c;至少执行一次。典型代表&#xff1a;do…while&#xff0c;goto&#xff08;已淘汰&#xff0c;不推荐使用&#xff09; do…while 语法&#xff1a; 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 各帧切换&#xff1a; 2、地平线control tool实现切换命令 默认HDR模式出图&#xff1a; HCG出图&#xff1a; LCG出图 SPD出图 VS出图...

09-轮转数组

给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 方法一&#xff1a;使用额外数组 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 风格前端页面示例&#xff0c;包含现代设计、响应式布局和常用功能&#xff1a; <template><div class"wiki-container"><!-- 头部导航 --><el-header class"wiki-header"><d…...

瑞芯微烧写工具

文章目录 前言一、安装驱动二、安装烧写工具1.直接解压压缩包2. 如何使用 三、MASKROM 裸机必备四、LOADER 烧写&#xff0c;前提是搞过第三步没问题五、Update.img包的烧录六、linux下烧写总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 项目需要…...

说下JVM中一次完整的GC流程?

大家好&#xff0c;我是锋哥。今天分享关于【说下JVM中一次完整的GC流程?】面试题。希望对大家有帮助&#xff1b; 说下JVM中一次完整的GC流程? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 JVM中的一次完整的垃圾回收&#xff08;GC&#xff09;流程可以概括为…...

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&#xff1a;SigmaStar Android分类A2-嵌入式OSD&#xff1a;SigmaStar Hi3536分…...

智慧农业-虫害及生长预测

有害生物防控系统是一个综合性的管理体系&#xff0c;旨在预防和控制对人类生活、生产甚至生存产生危害的生物。这些生物可能包括昆虫、动物、植物、微生物乃至病毒等。 一、系统构成 1、监测预警系统&#xff1a;利用智能传感器、无人机、遥感技术等手段&#xff0c;实时监测…...

Python 识别图片和扫描PDF中的文字

目录 工具与设置 Python 识别图片中的文字 Python 识别图片中的文字及其坐标位置 Python 识别扫描PDF中的文字 注意事项 在处理扫描的PDF和图片时&#xff0c;文字信息往往无法直接编辑、搜索或复制&#xff0c;这给信息提取和分析带来了诸多不便。手动录入信息不仅耗时费…...

C语言如何知道当前系统中的编译器数据类型的大小是多少?

在 C 语言中&#xff0c;你可以使用sizeof运算符来确定当前系统中编译器数据类型的大小&#xff0c;该运算符返回一个size_t类型的值&#xff0c;表示所操作对象或数据类型占用的字节数。下面为你详细介绍使用方法&#xff1a; 1. 基本数据类型大小的获取 基本数据类型如char…...

gitlab Webhook 配置jenkins时“触发远程构建 (例如,使用脚本)”报错

报错信息&#xff1a; <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

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…...

工程师如何运用专业技能参与人道主义项目:从思维转变到实践落地

1. 项目概述&#xff1a;工程师的人道主义行动倡议每年8月19日&#xff0c;世界人道主义日都会提醒我们关注那些在全球最艰苦、最危险地区默默奉献的人们。这个日子最初是为了纪念在履职中牺牲的人道主义工作者&#xff0c;如今已演变为一个更广泛的号召——庆祝那种激励全球人…...

java+uniapp集成unipush2实现消息推送

一、开通uniPush2.0 1.实名认证 登录DCloud开发者中心&#xff0c;通过实名认证 2.进入UniPush控制台 HBuilderX中打开项目的manifest.json文件 导航在“App模块配置” → 项的“Push(消息推送)” → “UniPush”下点击配置 或者申请开通。 3.配置应用信息 在UniPush开通界面…...

Blender 3MF插件终极指南:3D打印工作流的完整解决方案

Blender 3MF插件终极指南&#xff1a;3D打印工作流的完整解决方案 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 你是否正在寻找一个简单高效的3D打印文件处理方案&…...

MATLAB图像处理实战:用imfindcircles函数搞定工业零件瑕疵检测(附完整代码)

MATLAB图像处理实战&#xff1a;工业零件瑕疵检测的精准圆识别技术 在工业自动化质检领域&#xff0c;圆形特征的精准检测直接关系到产品质量控制的可靠性。轴承、垫片、齿轮等标准件上的孔洞缺失或尺寸偏差&#xff0c;往往预示着潜在的产品缺陷。传统人工检测不仅效率低下&am…...

SAP资产会计进阶:深入理解AS91、AB01与ABLDT在期初数据处理中的角色与联动

SAP资产会计核心事务代码解析&#xff1a;AS91、AB01与ABLDT的协同逻辑与实战应用 在SAP S4 HANA资产模块的实施与运维中&#xff0c;期初数据处理往往是项目成败的关键节点。不同于日常资产操作&#xff0c;期初数据迁移涉及历史价值追溯、折旧逻辑重建以及多系统数据对齐等复…...

AI Token中转副业火爆!小白也能快速上手?3小时建站+真实盈利模式全解析!

很多观望的小白最纠结两个核心问题&#xff1a;普通人搭建一个Token中转站到底要多久&#xff1f;建好之后真的能赚钱吗&#xff0c;真实赚钱逻辑是什么&#xff1f; 今天不讲噱头、不吹月入几万&#xff0c;结合行业真实现状、新手实操经验&#xff0c;一次性讲透搭建耗时、成…...

告别ST-LINK Utility!STM32CubeProg保姆级安装指南(含Java环境配置与常见报错解决)

从ST-LINK Utility到STM32CubeProg&#xff1a;嵌入式开发者的无缝迁移实战手册 当ST官方宣布STM32CubeProg将全面取代ST-LINK Utility时&#xff0c;许多习惯了旧工具的开发者都面临着一个现实问题&#xff1a;如何在不中断项目进度的情况下完成工具链的平稳过渡&#xff1f;作…...

利用大模型分歧优化NLP标注

In this blogpost I’d like to talk about large language models. There’s a bunch of hype, sure, but there’s also an opportunity to revisit one of my favourite machine learning techniques: disagreement. 在本文中&#xff0c;我想讨论大语言模型。虽然存在大量炒…...

Mac小白必看:手把手教你找回丢失的Recovery HD分区(附diskutil命令详解)

Mac用户必备技能&#xff1a;深度解析Recovery HD分区修复与diskutil实战指南 当你按下CommandR却只看到闪烁的问号图标时&#xff0c;那种手足无措的感觉我深有体会。Recovery HD分区就像是Mac的急救箱&#xff0c;藏着系统恢复、磁盘修复和时间机器备份等关键工具。但很多用户…...

别再手动算归一化了!用Origin9.1的‘列公式’功能一键搞定数据预处理

用Origin9.1列公式功能高效实现数据归一化&#xff1a;从原理到实战 科研数据处理中&#xff0c;归一化是消除量纲影响、提升分析结果可比性的关键步骤。传统手动计算不仅耗时费力&#xff0c;还容易因公式输入错误导致结果偏差。Origin9.1的"列公式"功能&#xff08…...