JavaScript函数柯里化及简单题目

news/2024/7/11 1:30:18 标签: javascript, 前端, typescript, es6

JavaScript函数柯里化及简单题目


1. 函数柯里化

柯里化是把接受多个参数的函数变换成接受一个单一参数的函数,并且返回一个新函数,这个新函数能够接受原函数的参数。下面可以通过例子来帮助理解。

javascript">// 简单的柯里化
function adder(num) {
	return function(x) {
		return num + x;
	}
}
var add5 = adder(5);
var add6 = adder(6);
console.log(add5(1)); // 6
console.log(add6(1)); // 7

柯里化在DOM的回调中非常有用。因为柯里化可以将分别多次传入的参数储存起来最后做同一处理。

通俗点说柯里化就是利用已有的函数, 再创建一个动态的函数,该动态函数内部还是通过已有的函数来发生作用,只是传入更多的参数来简化函数的参数方面的调用。

javascript">function curry(fn) {
	var args = [].slice.call(arguments, 1);
	return function() {
		return fn.apply(null, args.concat([].slice.call(arguments, 0)));
	}
}
function add(numl, num2} {
	return numl + num2;
}

var newAdd = curry(add, 5);
alert (newAdd (6)); / /11

在curry 函数的内部,私有变量args 相当千一个存储器,用来暂时存储在调用curry 函数时所传递的参数值,这样再跟后面动态创建函数调用时的参数合并并执行,就会得到一样的效果。

函数柯里化的基本方法和函数绑定是一样的:使用一个闭包返回一个函数。两者的区别在于,当函数被调用时,返回函数还需要设置一些传入的参数。

javascript">// 返回一个新函数,参数已提前内定
function bind(fn, context) {
	var args = Array.prototype.slice.call(arguments, 2);
	return function() {
		var innerArgs = Array.prototype.slice.call(arguments);
		var finalArgs = args.concat(innerArgs);
		return fn.apply(context, finalArgs);
	}
}
// 在Function.prototype就操存在有bind方法,函数可以直接调用,
// 语法:function.bind(thisArg[, arg1[, arg2[, ...]]]),与上述bind方法作用类似

创建柯里化函数的通用方式是:

javascript">function curry(fn) {
	var args = Array.prototype.slice.call(argurnents, 1);
	return function() {
		var innerArgs = Array.prototype.slice.call(argurnents);
		var finalArgs = args.concat(innerArgs);
		retrun fn.apply(null, finalArgs);
	}
}

curry 函数的主要功能就是将被返回的函数的参数进行排序。为了获取第一个参数后的所有参数,在arguments 对象上调用slice()方法,并传入参数1 表示被返回的数组的第一个元素应该是第二个参数。

2. 利用函数柯里化的简单题目

  • 实现一个函数add,使得add(3)(4)(5)() = 12,add(3)(4, 5)(6)() = 18

  • 代码实现:

    javascript">add.args = null // 静态变量args
    
    function add() {
    	// 第一次都没有传参数,直接结束
      if(arguments.length === 0) return null
    	// 将第一次传入的参数保存起来
      add.args = Array.from(arguments)
      
      	// 返回一个函数
      return function() {
        if (arguments.length === 0) {
        	// 调用时没有再传参数了,将之前收集的参数统一处理,返回结果
          const result = add.args.reduce((a, b) => {
            return a + b
          })
          return result
        } else {
        	// 调用时继续传入参数,将参数保存到静态变量中,返回本身函数准备接受下一次调用
          add.args = [...add.args, ...Array.from(arguments)]
          return arguments.callee
        }
      }
    }
    
    

http://www.niftyadmin.cn/n/1575750.html

相关文章

spring boot框架学习6-spring boot的web开发(2)

本章节主要内容:通过前面的学习,我们了解并快速完成了spring boot第一个应用。spring boot企业级框架,那么spring boot怎么读取静态资源?如js文件夹,css文件以及png/jpg图片呢?怎么自定义消息转换器呢&…

JavaScript函数的节流与防抖

JavaScript函数的节流与防抖 函数的 节流和防抖 可以有效的防止,函数频繁无意义的执行。至于选用节流还是防抖,得看具体的应用场景。 /*----------------------------------防抖函数---------------------------------*/ /** * description 防抖函数(de…

GCC更新到4.8支持C++11的特性

1.1 获取安装包并解压 wget http://ftp.gnu.org/gnu/gcc/gcc-4.8.2/gcc-4.8.2.tar.bz2 tar -jxvf gcc-4.8.2.tar.bz2 1.2 下载编译GCC所依赖的源码库,使用到一个特殊的脚本 cd gcc-4.8.2  ./contrib/download_prerequisites  将在./contrib目录下,下载…

多方面解决请求不同源跨越问题

多方面解决请求不同源跨越问题 ​ 同源策略是一种约定,由Netscape公司1995年引入浏览器,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议域名端口"三者相同…

Git学习第一课 版本控制的简介

疑问: git是做什么的? git是如何发展的? 一、git是做什么的? git是版本控制器。什么是版本控制器?就是记录每一次修改的内容的一个工具。举例来说, 你的操作 git记录 今天你新建了一个txt文本。 x年x月x日x…

JavaScript栈数据结构算法思想

JavaScript栈数据结构算法思想 栈的介绍 栈(stack)又名堆栈,它是一种运算受限的线性表,仅在表尾能进行插入和删除操作。这一端被称为栈顶,相对的另一端被称为栈尾。向一个栈中插入一个元素又称作进栈、入栈或压栈&…

Linux 2.4 NAT (网络地址转换) HOWTO(三)

5. 控制哪些要 NAT 您需要建立一些 NAT 规则﹐来告诉核心哪些联机要改变﹐同时如何去改变它们。要做到这点﹐我们需要一个非常多用� 的 iptables 工具﹐同时指定 -t nat 选项告诉它去修改 NAT 表格。 NAT 规则的表格含有三个列表叫做chains ﹕每一条规则都按顺序检查…

nodejs_express中使用art-template

nodejs_express中使用art-template 1. 安装 npm install art-template express-art-template2. 配置 const express require(express) const path require(path) const app express()//1.告诉express 框架使用什么模板引擎 渲染什么后缀的文件//第一个参数要渲染的文件后…