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系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
