Javascript教程六——闭包+箭头函数

箭头函数与闭包的关系:系统学习 深入探讨ES6中箭头函数如何影响闭包行为,揭示其在函数扩展中的独特作用。通过实际示例展示箭头函数与传统函数在闭包场景下的差异,帮助开发者更好理解es6函数扩展带来的编程变化。 阅读详情

6、高级函数

JavaScript的函数其实都指向某个变量。既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

function add(x, y, f) {
	 return f(x) + f(y);
}

编写高阶函数,就是让函数的参数能够接收别的函数。

6.1 map/reduce

map()方法定义在JavaScript的Array中,用于对数组中每个元素执行相应的操作。

var arr = [1,2,3,4,5];
function pow(x) {
	return x * x;
};
var arr1 = arr.map(pow);

reduce()方法则有一种迭代的效果。

var arr = [1,2,3,4,5];
function add(x, y) {
	return x + y;
};
arr.reduce(add);
// reduce 执行效果是 1+2+3+4+5 = 15

因此可以利用reduce进行求和/积,同时也可以将存在数组里面的数字转换成一个整数:

var arr = [1,2,3,4,5];
var num = arr.reduce(function toNumber(x,y){
	return x * 10 + y;
});
// num 12345

6.2 filter

用于把Array的某些元素过滤掉,然后返回剩下的元素:

原理:filter的参数是一个函数,这个函数会接受三个参数:element,数组元素;index,元素的index;self,数组本身。之后filter会把每个element都放入函数里面进行一次判断,如果函数返回true,则代表element满足函数条件,不会被清洗掉,否则就被清洗掉了。

var arr = [1, 2, 4, 5, 6, 9, 10, 15];
var r = arr.filter(function (x) {
	return x % 2 !== 0;
});
r; // [1, 5, 9, 15]

用filter()这个高阶函数,关键在于正确实现一个“筛选”函数。
利用filter,可以巧妙地去除Array的重复元素。

var r = arr.filter((element, index, self) =>{
	return self.indexOf(element) === index; // 元素出现的第一个位置是不是当前元素的位置
});

6.3 sort

对Array进行排序,但Array的排序会默认把所有元素转换成 string之后再排序,字母会使用首字母的ASCII码进行比较。

['Google', 'Apple', 'Microsoft'].sort(); // ['Apple', 'Google', 'Microsoft'];

['Google', 'apple', 'Microsoft'].sort(); // ['Google', 'Microsoft", 'apple']

[10, 20, 1, 2].sort();   // [1, 10, 2, 20];// 转换字符串后1在2的前面

不过sort()方法也是一个高阶函数,它还可以接收一个比较函数来实现自定义的排序。

var arr = [1,10,2,20];
arr.sort ( function (x, y) {
	if (x > y){
		return 1;
	}else if (x < y){
		return -1;
	}
	return 0;
});
arr;  // [1,2,10,20]

sort()方法会直接对Array进行修改,它返回的结果仍是当前Array。

6.4 闭包

闭包:就是能够读取其他函数内部变量的函数,或者子函数在外调用,子函数所在的父函数的作用域不会被释放。

简单来讲,就是帮助解决全局变量过多造成污染的问题。

举个🌰:

var a = 1;
function Person(){
	a++;
	return a;
}

上面是一个自增的例子,但是a是个全局变量,这样子其他函数不小心用了 a 就会造成 a 的 value 被污染。因此便提出来闭包。

function Person(){
	var a = 1;
	function ruby(){
		a++;
	}
	return ruby();
}
let rub = Person(); // ruby()
rub(); // 执行,此时会返回 2;
rub(); // 3;

很好理解,因为rub()函数就是ruby()函数,ruby函数勾连着a,那么Person函数里面的a就不会被释放,反而会一直存在,就会造成一种全局变量的假象,但是是一个局部变量。

6.5 函数柯里化

函数柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

简单来讲,便是最初一个函数接受很多个参数,但是现在通过函数里面设置函数来分别接受单个参数:

function(x,y);
function(x){
	return function(y);
}

函数柯里化很适合用在闭包里面。

6.6 箭头函数

在ES6中提出了箭头函数,用于替代function这些复杂的文字,例如:

var a = function(a,b){
	return a+b;
}
替换:  当然,主体还是要放在 {...} 中,只不过参数放在()里面,然后直接一个 =>来替换 function。
var a = (a,b) = > {
	return a+b;
}

6.6.1 this

箭头函数在JS里面尤为重要:这里我们需要了解一下,在js里面,有一个全局环境,这个全局环境只有一个,就是window。

然后这里讲一下匿名函数,匿名函数就是没有名字:

var a = function() {
	...
}

普通函数的函数内部环境就是当前函数的环境,当我们使用this时,this会自动绑定成函数所属的对象。

var a = {
	name = 'ruby',
	getName(){
		return this.name;
	}
}
a.getName();  // ruby

但是匿名函数有个问题,就是函数环境自动转换成全局环境,说白了,就是在匿名函数里面使用this,this会绑定到window上。

name = 'leo';
var b = {
	name = 'ruby',
	getName(){
		return function(){
			return this.name;
		}
	}
}
b.getName();  // leo

一般这个时候,最简单的方法就是找个变量来承接当前环境的this:

name = 'leo';
var b = {
	name = 'ruby',
	getName(){
		var that = this; // 这个this就指向b了
		return function(){
			return that.name;
		}
	}
}
b.getName();  // ruby

但是我既想使用匿名函数方便,又不想浪费内存存储变量,那么此时ES6就提出来箭头函数来解决匿名函数环境选择的问题。

箭头函数看上去是一种匿名函数的简写,但实际上,箭头函数和匿名函数有个明显的区别:箭头函数内部的this是词法作用域,也就是说,this不会去直接找全局变量,而是找当前函数所属的对象,问题解决了😄

name = 'leo';
var b = {
	name = 'ruby',
	getName(){
		return () => {
			return this.name;
		}
	}
}
b.getName();  // ruby

本文来源廖雪峰老师教程的笔记,有疑惑可以直接访问廖雪峰老师教程:https://www.liaoxuefeng.com/wiki/1022910821149312/1023022043494624

前端面试 - JS总结(2) - ES6 (let, 箭头函数, this) 作用域 闭包 四、箭头函数使用ES6箭头函数语法定义函数,将原函数的“function”关键字和函数名都删掉,并使用“=>”连接参数列表和函数体。当函数参数只有一个,括号可以省略;但是没有参数时,括号不可以省略。箭头函数完全修复了this的指向,this总是指向词法作用域。箭头函数没有自己的this,总是指向外部作用域箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式,一种只包含一个表达式,省略掉了{ … }和return。还有一种可以包含多条语句,这时候就不能省略{ … }和return。 阅读详情

相关推荐

【JavaScript】深入浅出 JavaScript 箭头函数:从语法到哲学

箭头函数不仅是语法糖,更体现了 JavaScript 语言设计的函数式编程倾向。其静态this绑定与简洁语法,推动开发者更关注数据流而非上下文切换,从而减少副作用,提升代码可预测性。工具的选择需适配场景。在复杂业务中,箭头函数与传统函数的混合使用,往往能兼顾效率与灵活性最终建议简单逻辑、需继承上下文的场景 → 箭头函数。需要动态this、构造函数或复杂对象方法 → 传统函数。通过理解其底层机制,开发者可更自如地驾驭这一特性,编写出既简洁又健壮的代码。

2302_79600390的博客 984

JS进阶基础2-箭头函数 闭包 函数柯里化

箭头函数,闭包,函数柯里化

weixin_40746230的博客 1095

ENVI5.6 自动化流程:GF系列卫星影像批处理与质量优化

本文详细介绍了如何利用ENVI5.6构建针对GF-2、GF-6、GF-7系列卫星影像的自动化批处理流水线。通过配置Batch Processing工具,实现从正射校正到图像融合的全流程批量处理,并分享参数设置、质量监控与故障排查的实战经验,旨在显著提升海量遥感影像的处理效率与成果质量。

efc1234567的博客 604

ES6-7【箭头函数的实质、箭头函数的使用场景】

一、箭头函数的实质 this由外层的函数作用域来决定(箭头函数的作用域是父级的作用域,不是父级) =>不能作为构造函数来使用(因为没有this) call、apply、bind无效(因为没有this) 没有arguments对象,用rest(拓展运算符)替代(因为与function不是同一种) yield 命令不能生效,在generator函数中(因为没有this) function foo(){ console.log(this) return (a) =>{

小管打天下的博客 1104

手把手教你用思岚RPLIDAR C1激光雷达实现简单环境扫描(树莓派4B+Ubuntu22.04)

本文详细介绍了如何在树莓派4B(Ubuntu 22.04系统)上驱动思岚RPLIDAR C1激光雷达,从硬件连接、权限配置、SDK编译到运行示例程序,最终实现环境扫描数据的可视化。通过手把手教程,帮助开发者和爱好者快速上手激光雷达应用,构建简单的环境扫描图。

j2k3l4的博客 1133

rag综述——RAG技术发展流程、最新技术挑战与系统级优化

RAG技术发展综述:本文系统梳理了检索增强生成(RAG)技术的演进历程,从2017年开放域问答中的早期探索,到2020年正式提出RAG架构并与大模型深度融合,再到2025年向系统化、可信化和智能体化发展。当前RAG面临检索可靠性、系统效率和生成可信度三大核心挑战,解决方案包括领域自适应训练、强化语义编码、迭代检索策略等优化方向。未来RAG将向GraphRAG、SafeRAG等方向发展,从单纯性能优化转向构建可控、可审计的语言系统框架,成为高可靠大模型应用的基础设施。

lovehu6686的博客 1244

JS高级 之【函数】

JS高级 之 【函数】

light的博客~~~ 579

【HarmonyOS】ArkUI的组件扩展

ArkuI的组件扩展主要是通过等装饰器来对于一些常用的自定义组件进行封装, 来简化UI开发流程, 提高自定义组件的可复用性。

2302_79763237的博客 1169

十、函数、闭包

函数是对象,函数名是指向函数对象的指针。 实现一个函数有函数声明、函数表达式和new Function() New Function()接受任意多个字符串作为参数,最后一个字符串作为函数体。这段代码会被解释两次,一次是普通的JS代码,一次是解释传给构造函数的字符串。 一、箭头函数 1.只有一个参数,可以不写括号;多个参数必须有括号 2.只有一行代码的函数体可以省略{},省略时默认返回这行代码的返回值 3.箭头函数不能使用arguments、super和new.target,也没...

coderxsj 3455

毕业设计——基于卷积神经网络的高速公路团雾智能识别系统设计与实现(数据集+源码+可视化+综述)

同时,也可以结合其他技术,如雷达、红外传感器等,实现多源信息的融合与协同处理,提高系统的可靠性和稳定性。实验结果表明,该系统能够实现对高速公路团雾的准确、快速识别,为高速公路的安全运行提供了有力保障。团雾作为一种常见的气象现象,具有突发性、局地性和消散迅速的特点,对高速公路的行车安全构成严重威胁。通过设计合适的网络结构,如增加卷积层、池化层等,实现对图像中团雾特征的自动学习和提取。预处理:对采集到的图像进行去噪、增强等预处理操作,以提高图像质量,降低后续处理的难度。读取数据,随机分为训练集和验证集。

abackcab的博客 668

视觉辅助RIS波束追踪:用摄像头“看见”用户,实现毫秒级波束对准

在无线通信领域,波束成形技术是提升高频段信号覆盖与质量的核心手段,其原理是通过调整天线阵列的相位,使信号能量在特定方向相干叠加,形成高增益定向波束。这项技术的价值在于能有效克服高频信号路径损耗大、穿透性差的瓶颈,广泛应用于5G/6G、毫米波通信及室内定位等场景。然而,传统波束追踪依赖信道估计或波束扫描,存在训练开销大、实时性差的问题。本文聚焦于一种创新解决方案:将计算机视觉与可重构智能表面(RIS)相结合。通过摄像头直接感知用户位置,并利用RIS快速重构反射波束方向,实现了近乎零开销、毫秒级延迟的波束追踪,

weixin_33552698的博客 620

JavaScript : 箭头函数 对比 闭包函数

参考: 闭包可以让你从内部函数访问外部函数作用域 箭头函数相当于匿名函数, 简化了函数的定义 测试 <!DOCTYPE html> <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="https://cdnjs.

火星男孩的分享空间 207

12、每日卫星任务规划问题的不同公式

本文探讨了卫星任务规划问题的多种数学公式表示方法,包括传统的整数线性规划(ILP)模型、改进的基于路径的公式、基于集合覆盖的公式以及动态规划公式。通过案例研究比较了不同公式的求解效率和适用场景,并提供了使用Python进行实际求解的操作步骤。最后讨论了进一步优化策略及未来研究方向,旨在为解决卫星任务规划问题提供全面的理论支持和实践指导。

assembly8low的博客 204

JavaScript箭头函数详解

箭头函数是JavaScript的强大特性,但像所有工具一样,应当在正确的场景中使用它们。以下是一些最佳实践和总结建议。箭头函数是JavaScript的强大特性,它们提供了简洁的语法和词法this绑定,使代码更加简洁和清晰。通过理解箭头函数的特性、限制和最佳实践,开发者可以更有效地使用它们,写出更加优雅和高效的JavaScript代码。箭头函数最适合用在没有自己的this上下文需求的场景,特别是作为回调函数、在Promise链中、以及在各种函数式编程模式中。

yk_dflkg的博客 3387

某智能物流无人值守系统 ExportReport SQL注入漏洞复现

某智能物流无人值守系统 ExportReport存在SQL注入漏洞,未经身份验证的远程攻击者除了可以利用 SQL 注入漏洞获取数据库中的信息(例如,管理员后台密码、站点的用户个人信息)之外,甚至在高权限的情况可向服务器中写入木马,进一步获取服务器系统权限。

0xSec 819

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

JavaScript的作用域,变量提升,闭包和箭头函数

JavaScript 重点 一、作用域 在JavaScript中,有全局作用域、局部作用域。 1、全局作用域:全局变量有全局作用域,网页中所有脚本和函数均可使用,都在全局作用域里。如果你尚为声明的变量赋值,此变量会自动成为全局变量,但在严格模式运行,是不会自动创建的全局变量的。全局变量会在你关闭页面时被删除。 2、局部作用域:局部作用域一般只在固定的代码片段可访问到,外部是无法访问的,它分为函数作...

qq_42248962的博客 556

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

JavaScript 箭头函数,闭包函数中的this指向

箭头函数,闭包函数中的this指向 在javscript中,this 是在函数运行时自动生成的一个内部指针,它指向函数的调用者。 箭头函数有些不同,它的this是继承而来, 默认指向在定义它时所处的对象(宿主对象),而不是执行时的对象。 var name = "window"; var test = { name:"demo", // 传统函数 getName1: function(){ console.log(this.name); // demo

qq_27054291的博客 457

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

闭包的优缺点分别是什么?

闭包可在函数执行后保留其作用域内的变量,实现数据的持久化存储。闭包会阻止其引用的变量被垃圾回收,若长期持有大型对象或 DOM 元素的引用,可能导致内存泄漏。闭包的创建和维护需要额外的内存空间,在循环或高频操作中大量创建闭包可能影响性能。通过闭包可实现类似类的私有成员,外部无法直接访问,增强代码的安全性和封装性。闭包捕获的是变量的引用,而非值的副本,可能导致异步操作中变量值不符合预期。闭包是函数柯里化、偏函数等技术的基础,支持更灵活的函数组合与复用。在回调函数中,闭包可捕获并保持执行上下文,避免。

qq_18421479的博客 2028

This 指向问题,闭包,箭头函数

https://www.cnblogs.com/pssp/p/5216085.html 一、this指向 this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象 如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window,这里需要说明的是在js的严格版中this指向的不是window,但是我们这里不探讨严格版的问题 如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指

weixin_42910765的博客 455

【Web】0基础学Web—函数、箭头函数、函数闭包、函数参数、js作用域、字符串

0基础学Web—函数、箭头函数、函数闭包、函数参数、js作用域、字符串函数函数声明函数调用函数事件调用函数匿名函数立即执行函数箭头函数函数闭包函数参数js作用域字符串字符串创建字符串方法字符串拼接字符串截取去除字符串首尾空格遍历其他 函数 function 函数名(形参){ 函数体 return val //只能return一个值 } 函数声明 <script> function add(a, b) { return a + b } let a = 10, b = 20 let c

2201_75539182的博客 1076

Javascript---函数,闭包,箭头函数

函数 1.在JavaScript中,定义函数的方式如下: function abs(x) { if (x >= 0) { return x; } else { return -x; } } 并不像Java返回值需要声明 2.第二种定义函数的方式如下: var abs = function (x) { if (x >=...

qq_40277163的博客 490

箭头函数、递归算法、this、闭包、防抖

使用箭头函数按条件输出 let e = [1,2,3,4,5,6,7,8,9].filter((value,index) => value <= 3); console.log(e) //打印出的结果:[1,2,3] let sum = [1,2,3,4,5,6].reduce((a,b) => a+b); console.log(sum) //打印出的结果:21 递归算法 function factorial(num){ return num = 1 ? 1:num * factor

weixin_45736311的博客 1349

JavaScript闭包和this

目录JavaScript闭包和this1 闭包1.1 变量作用域1.2 读取函数内部的局部变量1.3 闭包概念2 this2.1 关键点:2.2 四类调用方式1)作为对象方法的调用2)纯粹的函数调用3)作为构造函数调用4)使用apply、call、bind调用2.3 箭头函数中的this3 样例详解参考 JavaScript闭包和this 1 闭包 一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。也就

weixin_40780777的博客 6592

JS函数和闭包函数详解

JS函数和闭包函数详解

fanchen4139的博客 1020

JS(六)JavaScript中的函数

使用function。

无人罪的博客 1030
上一篇: Vue-router教程六——路由懒加载
下一篇: Javascript教程七——标准对象
ruby___ruby
博客等级 码龄9年 2粉丝 28原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值