Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【深入理解JS核心技术】15. 什么是柯里化函数

【深入理解JS核心技术】15. 什么是柯里化函数

作者头像
达达前端
发布于 2022-05-15 01:43:36
发布于 2022-05-15 01:43:36
48900
代码可运行
举报
文章被收录于专栏:达达前端达达前端
运行总次数:0
代码可运行

柯里化是将具有多个参数的函数转换为一系列函数的过程,每个函数只有一个参数。Currying 以数学家Haskell Curry的名字命名。通过应用柯里化,n 元函数将其转换为一元函数。

让我们举一个 n 元函数的例子,以及它是如何变成柯里化函数的,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const multiArgFunction = (a, b, c) => a + b + c;
console.log(multiArgFunction(1, 2, 3)); // 6

const curryUnaryFunction = (a) => (b) => (c) => a + b + c;
curryUnaryFunction(1); // returns a function: b => c =>  1 + b + c
curryUnaryFunction(1)(2); // returns a function: c => 3 + c
curryUnaryFunction(1)(2)(3); // returns the number 6
复制代码

Curried 函数对于提高代码的可重用性和函数组合非常有用。

函数声明与函数表达式

JavaScript引擎在任何代码执行之前,会先读取函数声明,并在执行上下文中生成函数定义。而函数表达式必须等到代码执行到它那一行,才会在执行上下文中生成函数定义。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 没问题
console.log(sum(10, 10));
function sum(num1, num2) {
 return num1 + num2;
}
复制代码

代码可以正常运行,因为函数声明会在任何代码执行之前先被读取并添加到执行上下文。这个过程叫作函数声明提升。

在执行代码时,JavaScript引擎会先执行一遍扫描,把发现的函数声明提升到源代码树的顶部。因此即使函数定义出现在调用它们的代码之后,引擎也会把函数声明提升到顶部。

改为函数表达式就回出错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 会出错
console.log(sum(10, 10));
let sum = function(num1, num2) {
 return num1 + num2;
};
复制代码

函数作为值

因为函数名在ECMAScript中就是变量,所以函数可以用在任何可以使用变量的地方。这意味着不仅可以把函数作为参数传给另一个函数,而且还可以在一个函数中返回另一个函数。

函数表达式

定义函数有两种方式:函数声明和函数表达式。

函数声明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function functionName(arg0, arg1, arg2) {
 // 函数体
}
复制代码

函数声明的关键特点是函数声明提升,即函数声明会在代码执行之前获得定义。这意味着函数声明可以出现在调用它的代码之后:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sayHi();
function sayHi() {
 console.log('Hi!');
}
复制代码

因为 JavaScript 引擎会先读取函数声明,然后再执行代码。

第二种创建函数的方式就是函数表达式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let functionName = function(arg0, arg1, arg2) {
 // 函数体
}
复制代码

函数表达式看起来就像一个普通的变量定义和赋值,即创建一个函数再把它赋值给一个变量functionName。

这样创建的函数叫作匿名函数(anonymous funtion),因为 function 关键字后面没有标识符。(匿名函数有也时候也被称为兰姆达函数)。

任何时候,只要函数被当作值来使用,它就是一个函数表达式。

未完结!更多内容尽情期待下一节~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Web前端学习 第3章 JavaScript基础教程6 函数基础
函数是一个可执行的语句块,定义的时候不执行,调用的时候执行,使用"函数名()"的形式可以调用函数, 语法如下所示:
学习猿地
2020/06/16
3690
函数声明与表达式的区别
HTML5学堂:函数有不同的定义方法,一种是函数声明,另一种是函数表达式,那么这两种有何区别呢? 函数声明的基本语法 function functionName(arg0, arg1, ..., argn) { // 函数体 - HTML5学堂 } 函数声明的重要特征:函数声明提升 在执行代码之前,会先读取函数声明,这也就意味着,可以把函数声明放在调用它的语句的后面。 函数表达式的常见语法形式 var functionName = function(arg0, arg1, ..., argn) {
HTML5学堂
2018/03/12
8010
JS 语法糖 1 —— 箭头函数
从 ECMAScript 6 开始,JS 新增了一种新的函数:箭头函数(Arrow Function)。
恋喵大鲤鱼
2021/02/22
2.2K0
彻底搞懂闭包,柯里化,手写代码,金九银十不再丢分!
这段时间我试着通过思维导图来总结知识点,主要关注的是一些相对重要或理解难度较高的内容。下面是同系列文章:
程序员白彬
2020/08/25
1.6K0
彻底搞懂闭包,柯里化,手写代码,金九银十不再丢分!
【JavaScript】函数 ⑦ ( 函数定义方法 | 命名函数 | 函数表达式 )
在 函数表达式 中 , 可以将 匿名函数 赋值给一个变量 , 上面的语法结构就是 将 匿名函数 赋值给 变量 的 语法 ;
韩曙亮
2024/04/09
3320
【JavaScript】函数 ⑦ ( 函数定义方法 | 命名函数 | 函数表达式 )
一篇文章带你了解JavaScript中的函数表达式,递归,闭包,变量,this对象,模块作用域
它的一个重要特点就是:函数声明提升,就是在执行代码前先读取函数声明,可以把函数声明放在调用它的语句后。
达达前端
2020/01/02
6760
javascript 函数详解
一、函数的一些基础概念: 1.js中的函数使用function来声明。 2.关于return: 2.1  函数在执行到return语句后悔立即停止并退出,return后面的代码永远不会得到执行; 2.2  函数不必指定是否返回值,只要return语句后跟要返回的值即可实现返回值; 2.3  return语句不带任何返回值时,会返回undefined值,这种做法一般用在需要提前停止函数执行而又不需要返回值的情况。 3.理解参数: 3.1  函数不介意传递进来参数个数以及类型,因为js中的参数在内部是用一个数组
柴小智
2018/04/10
9160
JavaScript | 函数定义的两种方法;预编译与执行
HTML5学堂(码匠):在JavaScript当中,函数的定义有两种常见方法,这两种方法有何不同?与这种不同点息息相关的“预编译与执行”又是什么意思? 1.如何定义函数 方法1:函数声明 方法2:
HTML5学堂
2018/03/13
8910
JavaScript | 函数定义的两种方法;预编译与执行
JS面试之函数(1)
1.函数声明有预解析,而且函数声明的优先级高于变量; 2.使用Function构造函数定义函数的方式是一个函数表达式,这种方式会导致解析两次代码,影响性能。第一次解析常规的JavaScript代码,第二次解析传入构造函数的字符串
火狼1
2019/04/17
2.1K0
JS面试之函数(1)
前端架构师进阶之路07_JavaScript函数
相当于将一条或多条语句组成的代码块包裹起来,在使用时只需关心参数和返回值,就能完成特定的功能,而不用了解具体的实现。
张哥编程
2024/12/13
1670
前端架构师进阶之路07_JavaScript函数
JavaScript第五节
全局作用域 :在script标签内,函数外的区域就是全局作用域,在全局作用内声明的变量叫做全局变量 。全局变量可以在任意地方访问。
用户3461357
2019/08/02
6810
啊,函数呐!!!
一份需要你补充完整的函数导图!我还是一个初学者,这篇文章是我所知道的所有关于函数的知识,如有不完善或者错误,希望能够在评论下方指出,哈哈哈,大神勿喷。
sunseekers
2018/10/31
8930
javascript高级程序设计(4-5)章笔记
版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/article/details/51234909
空空云
2018/09/27
4850
函数与作用域
1.函数声明和函数表达式有什么区别 函数就是一段可以反复调用的代码块。函数还能接受输入的参数,不同的参数会返回不同的值。 JavaScript有三种方法,可以声明一个函数。 1.function命令 function命令声明的代码区块,就是一个函数。function命令后面是函数名,函数名后面是一对圆括号,里面传入函数的参数。函数体放在大括号里面。 function add(s) { console.log(s) } 上面的代码命名了一个print函数,以后使用print()这种形式,就可以调用相应
小胖
2018/06/27
8800
ES6——箭头函数
ES6之后,允许使用箭头=>来定义函数。首先我们来总结一下箭头函数存在的意义,之后再来细细的看它的使用方法。
Originalee
2018/08/30
7220
javascript函数
函数声明提升 执行代码前会先读取函数声明,可以把函数声明放在调用他的语句后面。 sayHi(); function sayHi(){ alert("Hi!"); } 使用函数表达式创建函数 var functionName=function(arg0,arg1){ //函数体【此函数成为匿名函数】 } 递归 function factorial(num){ if(num<=1){ return 1; }else{ return num*arguments.callee(num-1); } } //argum
wangxl
2018/03/07
9220
JS与ES6高级编程学习笔记(二)——函数与作用域
开发者常戏称"函数是JavaScript中的一等公民",这足以体现了函数的重要性,为了更好的掌握函数我们需要学习函数的构造器Function等相关内容。
张果
2022/05/31
1.4K0
JS与ES6高级编程学习笔记(二)——函数与作用域
JavaScript——函数
在JS里面,可能会定义非常多的相同代码或者功能相似的代码,这些代码可能需要大量重复使用。
岳泽以
2022/10/26
9400
你知道ES6箭头函数的优缺点吗?
我们都知道,在 JavaScript 里定义函数有多种方式。最常见的是用function关键字:
胡哥有话说
2020/06/04
8.9K0
javascript中函数声明与函数表达式
在javascript中,我们经常要声明函数,或者使用函数表达式,今天我们就来说说这两者的区别。
小明爱学习
2020/01/21
5250
相关推荐
Web前端学习 第3章 JavaScript基础教程6 函数基础
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验