浅谈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 相关文章推荐
关于IE BUG与字符串截取substr的解决办法
Apr 10 Javascript
Jquery获取复选框被选中值的简单方法
Jul 04 Javascript
jquery中的工具使用方法$.isFunction, $.isArray(), $.isWindow()
Aug 09 Javascript
不能不知道的10个angularjs英文学习网站
Mar 23 Javascript
JS功能代码集锦
May 04 Javascript
js原型链与继承解析(初体验)
May 09 Javascript
js简单时间比较的方法
Aug 02 Javascript
jQuery插件fullPage.js实现全屏滚动效果
Dec 02 Javascript
详解JavaScript对象的深浅复制
Mar 30 Javascript
vue服务端渲染缓存应用详解
Sep 12 Javascript
Smartour 让网页导览变得更简单(推荐)
Jul 19 Javascript
js实现坦克大战游戏
Feb 24 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
牡丹941资料
2021/03/01 无线电
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
2010/12/02 PHP
PHP 之Section与Cookie使用总结
2012/09/14 PHP
php利用curl抓取新浪微博内容示例
2014/04/27 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
2014/04/30 PHP
php生出随机字符串
2017/07/06 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
详解PHP发送邮件知识点
2018/05/06 PHP
php判断数组是否为空的实例方法
2020/05/10 PHP
Pro JavaScript Techniques学习笔记
2010/12/28 Javascript
js+html5实现canvas绘制网页时钟的方法
2016/05/21 Javascript
JavaScript使用链式方法封装jQuery中CSS()方法示例
2017/04/07 jQuery
node.js 中间件express-session使用详解
2017/05/20 Javascript
详解JavaScript调用栈、尾递归和手动优化
2017/06/03 Javascript
最基础的vue.js双向绑定操作
2017/08/23 Javascript
分享5个好用的javascript文件上传插件
2018/09/16 Javascript
ligerUI的ligerDialog关闭刷新的方法
2019/09/27 Javascript
flask中主动抛出异常及统一异常处理代码示例
2018/01/18 Python
解决phantomjs截图失败,phantom.exit位置的问题
2018/05/17 Python
Python实现的简单排列组合算法示例
2018/07/04 Python
python ChainMap的使用和说明详解
2019/06/11 Python
用scikit-learn和pandas学习线性回归的方法
2019/06/21 Python
django-allauth入门学习和使用详解
2019/07/03 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
2020/05/23 Python
详解Html5 Canvas画线有毛边解决方法
2018/03/01 HTML / CSS
新大陆软件面试题
2016/11/24 面试题
统计员岗位职责
2013/11/14 职场文书
生日礼品店创业计划书范文
2014/03/21 职场文书
公司委托书格式范文
2014/04/04 职场文书
卫生院健康教育实施方案
2014/06/07 职场文书
个人学习党的群众路线教育实践活动心得体会
2014/11/05 职场文书
2016年七夕情人节宣传语
2015/11/25 职场文书
《我们的民族小学》教学反思
2016/02/19 职场文书
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL
Windows11性能真的上涨35%? 桌面酷睿i9实测结果公开
2021/11/21 数码科技
python中pycryto实现数据加密
2022/04/29 Python