原生bind方法

  不同于jQuery中的bind方法只是简单的绑定事件函数,原生js中bind()方法略复杂,该方法上在ES5中被引入,大概就是IE9+等现代浏览器都支持了(有关ES5各项特性的支持情况戳这里ECMAScript 5 compatibility table),权威指南上提到在ES3中利用apply模拟该方法的实现(JS权威指南中函数那章), 但无法真实还原该方法, 这也是真bind方法中的有趣特性。

  (原文这边理解有问题, 这段话的意思如果结合犀牛书上下文的意思, 再结合犀牛书中bind()方法实现, 是说把bind()方法第一个参数以后的所有参数作为返回函数的起始实参)首先bind不同于call和apply只是单纯地设置this的值后传参,它还会将所有传入bind()方法中的实参(第一个参数之后的参数)与this一起绑定,我个人的理解是其后的参数也会作为绑定上下文的一部分,以下为《js权威指南》原文的说法:

The ECMAScript 5 bind() method does more than just bind a function to an object. It also performs partial application: any arguments you pass to bind() after the first are bound along with the this value.

  关于这个特性看《权威指南》原文的栗子:

var sum = function(x,y) { return x + y }; var succ = sum.bind(null, 1); //让this指向null,其后的实参也会作为实参传入被绑定的函数sum

succ(2) // => 3:  可以看到1绑定到了sum函数中的x

  其次, bind()方法所返回的函数的length(形参数量)等于原函数的形参数量减去传入bind()方法中的实参数量(就是剩下没有传的参数),因为传入bind中的实参都会绑定到原函数的形参,吗的,绕死了, 举个栗子:

function  func(a,b,c,d){...} //func的length为4var after = func.bind(null,1,2)  //这里输入了两个实参(1,2)绑定到了func函数的a,b

console.log(after.length) //after的length为 2

  第三,当bind()所返回的函数用作构造函数的时候, 传入bind()的this将被忽略,实参会全部传入原函数,这样说很抽象, 举个栗子?

function original(x){this.a=1;this.b =function(){return this.a + x}
}
var obj={a:10
}
var  newObj = new (original.bind(obj,2)) //传入了一个实参2
console.log(newObj.a)  //输出 1, 说明返回的函数用作构造函数时obj(this的值)被忽略了

console.log(newObj.b()) //输出3 ,说明传入的实参2传入了原函数original

  函数柯里话的概念

  以上就是ES5中bind方法的特性, 这种技术也被称为函数柯里化,在看《js权威指南》的时候感觉这玩意逼格太高直接忽略了,最近又碰到这概念, 索性打算搞定他。
函数柯里化在百科的解释为:

在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。这个技术由 Christopher Strachey 以逻辑学家 Haskell Curry 命名的,尽管它是 Moses Schnfinkel 和 Gottlob Frege 发明的。

  以上翻译成人话就是:这种技术将多个参数的函数变成只带一个参数的函数。bind方法就是该技术在js中的实践。作为一个菜鸟, 目前只用过bind设置this的值, 码这篇博客的目的就是厘清下bind的特性。

  原文链接:https://segmentfault.com/a/1190000003963461

【转载】JS中bind方法与函数柯里化相关推荐

  1. Python中的偏函数和函数柯里化

    偏函数(partial)和函数柯里化(currying)是函数式编程中常用的技术.有时候我们在复用已有函数时可能需要固定其中的部分参数,这除了可以通过默认值参数来实现之外,还可以使用偏函数.例如有个函 ...

  2. js面试高频题:函数柯里化的实现(彻底弄懂)

    函数柯里化的适用场景有: 1. 参数复用 2. 延时执行 3. 提前确认 函数柯里化的核心在于:函数里面返回函数,从而做到参数复用的目的. 我们以一个js经典面试题为例开始讲解: 实现一个函数,使得满 ...

  3. 高级函数技巧-函数柯里化

    我们经常说在Javascript语言中,函数是"一等公民",它们本质上是十分简单和过程化的.可以利用函数,进行一些简单的数据处理,return 结果,或者有一些额外的功能,需要通过 ...

  4. 了解js基础知识中的作用域和闭包以及闭包的一些应用场景,浅析函数柯里化

    js基础知识中的作用域和闭包 一.作用域 1.作用域.自由变量简介 (1)作用域定义 (2)作用域实例演示 (3)自由变量定义 (4)自由变量实例演示 2.作用域链简介 (1)作用域链定义 (2)作用 ...

  5. 【JS函数】JS函数之高阶函数、组合函数、函数柯里化

    自我介绍:大家好,我是吉帅振的网络日志:微信公众号:吉帅振的网络日志:前端开发工程师,工作4年,去过上海.北京,经历创业公司,进过大厂,现在郑州敲代码. JS函数专栏 1[JS函数]JS函数之普通.构 ...

  6. 函数柯里化的意义_详解JS函数柯里化

    第一次看到柯里化这个词的时候,还是在看一篇算法相关的博客提到把函数柯里化,那时一看这个词就感觉很高端,实际上当你了解了后才发现其实就是高阶函数的一个特殊用法. 果然是不管作用怎么样都要有个高端的名字才 ...

  7. 高阶函数、js函数内返回一个内部函数详解---->函数柯里化

    高阶函数 如果一个函数符合下面2个规范中的任何一个,那该函数就是高阶函数. 若A函数,接收的参数是一个函数,那么A就可以称之为高阶函数. 若A函数,调用的返回值依然是一个函数,那么A就可以称之为高阶函 ...

  8. bind函数返回值-1_javascript函数柯里化

    函数柯里化 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术.这个技术由 Chris ...

  9. JS - 函数柯里化

    一.概念 柯里化是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数. 简单来说,柯里化是一种函数的转换,它是指将一个函数从可调用的 ...

最新文章

  1. python中创建列表[]和list()哪个效率快?为什么快?快多少呢?
  2. 致命错误:没有用于主机192.168.1.112,用户postgres
  3. java-基础练习题3
  4. 201107阶段二Linux-qt编程
  5. 三星Galaxy Note 10系列价格曝光:顶配售价要破万
  6. 802.11相关术语及其设计(二)
  7. 第 10 章 容器监控 - 080 - Weave Scope 容器地图
  8. springboot event线程池总结
  9. mysql站内搜索_纯php+mysql打造的站内搜索
  10. 扫描仪 无线 打印服务器,树莓派搭建网络打印机 扫描仪服务器
  11. zabbix通过sendmail进行邮箱警报
  12. react结合rust编写wasm图像处理
  13. 2022年通信工程专业保研:从四非到浙大工院夏令营面试经验分享(前期准备篇/含通信原理面试真题)
  14. [QT]The inferior stopped because it received a signal from the operating system 自己解决方法
  15. 利用python爬取知乎评论_一个简单的python爬虫,爬取知乎
  16. tensorflow.python.framework.errors_impl.InvalidArgumentError exception str() failed解决办法
  17. java获取分贝_android 声音强度、分贝 大小检测 源码下载(as版)
  18. elasticsearch数据备份与恢复(kibana操作)
  19. fast无线网卡linux驱动,fast FW150US USB无线网卡Linux驱动安装
  20. 算白塞尔公式matlab,中误差计算公式

热门文章

  1. win10系统下安装Linux虚拟机以及在虚拟机上安装Ubuntu
  2. Redis 常用命令(学习笔记二)
  3. 敏捷落地的会议和工具
  4. HDU4417 线段树 + 离线处理
  5. jQuery 事件的命名空间
  6. hibernate中延迟加载的设定(懒加载的设定)
  7. Linux下硬盘性能测试
  8. 更适合智能家庭使用的新 Wi-Fi 技术问世了
  9. jquery extend中
  10. 3403: [Usaco2009 Open]Cow Line 直线上的牛