浅谈JS中的bind方法与函数柯里化


Posted in Javascript onAugust 10, 2016

绑定函数bind()最简单的用法是创建一个函数,使这个函数不论怎么调用都有同样的this值。不同于call和apply只是单纯地设置this的值后传参,它还会将所有传入bind()方法中的实参(第一个参数之后的参数)与this一起绑定。

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

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为4

var 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方法的特性, 这种技术也被称为函数柯里化。这种技术将多个参数的函数变成只带一个参数的函数。bind方法就是该技术在js中的实践。

关于这篇浅谈JS中的bind方法与函数柯里化就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript Select标记中options操作方法集合
Oct 22 Javascript
THREE.JS入门教程(6)创建自己的全景图实现步骤
Jan 25 Javascript
jquery ztree实现下拉树形框使用到了json数据
May 14 Javascript
JS+CSS实现自动切换的网页滑动门菜单效果代码
Sep 14 Javascript
javascript函数式编程程序员的工具集
Oct 11 Javascript
AngularJS 如何在控制台进行错误调试
Jun 07 Javascript
Node.js Streams文件读写操作详解
Jul 04 Javascript
最全面的JS倒计时代码
Sep 17 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
Dec 23 Javascript
Vue filters过滤器的使用方法
Jul 14 Javascript
Node.js爬取豆瓣数据实例分析
Mar 05 Javascript
通过滑动翻页效果实现和移动端click事件问题
Jan 26 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
Aug 10 #Javascript
JS控制静态页面传递参数并获取参数应用
Aug 10 #Javascript
基于JavaScript实现树形下拉框
Aug 10 #Javascript
关于原生js中bind函数的简单实现
Aug 10 #Javascript
Mvc提交表单的四种方法全程详解
Aug 10 #Javascript
mvc中form表单提交的三种方式(推荐)
Aug 10 #Javascript
浅谈JS运算符&&和|| 及其优先级
Aug 10 #Javascript
You might like
摘自织梦CMS的HTTP文件下载类
2015/08/08 PHP
PHP实现类似题库抽题效果
2018/08/16 PHP
一款JavaScript压缩工具:X2JSCompactor
2007/06/13 Javascript
jQuery实现企业网站横幅焦点图切换功能实例
2015/04/30 Javascript
jQuery幻灯片带缩略图轮播效果代码分享
2015/08/17 Javascript
基于JavaScript实现动态添加删除表格的行
2016/02/01 Javascript
javascript加载xml 并解析各节点的值(实现方法)
2016/10/12 Javascript
jQuery ajaxForm()的应用
2016/10/14 Javascript
微信小程序实现页面跳转传值的方法
2017/10/12 Javascript
js+html获取系统当前时间
2017/11/10 Javascript
Angularjs中date过滤器失效的问题及解决方法
2018/07/06 Javascript
js实现详情页放大镜效果
2020/10/28 Javascript
JS常用跨域方法实现原理解析
2020/12/09 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
2021/01/29 Javascript
[00:36]DOTA2上海特级锦标赛 Alliance战队宣传片
2016/03/04 DOTA
[04:15]DOTA2-DPC中国联赛1月19日Recap集锦
2021/03/11 DOTA
python实现无证书加密解密实例
2014/10/27 Python
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
2019/01/15 Python
Python对象与引用的介绍
2019/01/24 Python
Python制作微信好友背景墙教程(附完整代码)
2019/07/17 Python
Python 过滤错误log并导出的实例
2019/12/26 Python
Python3使用腾讯云文字识别(腾讯OCR)提取图片中的文字内容实例详解
2020/02/18 Python
Python3获取cookie常用三种方案
2020/10/05 Python
如何用border-image实现文字气泡边框的示例代码
2020/01/21 HTML / CSS
HTML5之WebGL 3D概述(下)—借助类库开发及框架介绍
2013/01/31 HTML / CSS
HTML5 SEO优化的一些建议
2020/08/27 HTML / CSS
可靠的数据流传输TCP
2016/03/15 面试题
毕业生自我鉴定范文
2013/11/08 职场文书
工程管理造价应届生求职信
2013/11/13 职场文书
村捐赠仪式答谢词
2014/01/21 职场文书
促销活动计划书
2014/05/02 职场文书
人口与计划生育责任书
2015/05/09 职场文书
幼儿园开学温馨提示
2015/07/15 职场文书
关于军训的感想
2015/08/07 职场文书
高中地理教学反思
2016/02/19 职场文书