浅谈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正则表达式中参数g(全局)的作用
Nov 11 Javascript
Jquery方式获取iframe页面中的 Dom元素
May 07 Javascript
JavaScript中的console.log()函数详细介绍
Dec 29 Javascript
JavaScript将Web页面内容导出到Word及Excel的方法
Feb 13 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
Apr 27 Javascript
js简单倒计时实现代码
Apr 30 Javascript
Js自定义多选框效果的实例代码
Jul 05 Javascript
微信小程序实现下拉刷新和轮播图效果
Nov 21 Javascript
vue微信分享 vue实现当前页面分享其他页面
Dec 02 Javascript
jQuery实现ajax回调函数带入参数的方法示例
Jun 26 jQuery
electron实现静默打印的示例代码
Aug 12 Javascript
JavaScript canvas动画实现时钟效果
Feb 10 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
apache+php+mysql安装配置方法小结
2010/08/01 PHP
php实现仿写CodeIgniter的购物车类
2015/07/29 PHP
Thinkphp自定义代码生成工具及用法说明(附下载地址)
2016/05/27 PHP
PHP与以太坊交互详解
2018/08/24 PHP
PHP中将一个字符串部分字符用星号*替代隐藏的实现代码
2019/09/08 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
2020/05/02 PHP
jquery 添加节点的几种方法介绍
2013/09/04 Javascript
JS中三目运算符和if else的区别分析与示例
2014/11/21 Javascript
Javascript模块化编程详解
2014/12/01 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
2015/09/24 Javascript
基于jQuery实现选取月份插件附源码下载
2015/12/28 Javascript
Bootstrap使用基础教程详解
2016/09/05 Javascript
Mac下使用charles遇到的问题以及解决办法
2017/01/10 Javascript
JQuery查找子元素find()和遍历集合each的方法总结
2017/03/07 Javascript
微信小程序中页面FOR循环和嵌套循环
2017/06/21 Javascript
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
2017/09/20 jQuery
jQuery读取本地的json文件(实例讲解)
2017/10/31 jQuery
vue-cli 构建骨架屏的方法示例
2018/11/08 Javascript
elementUI select组件使用及注意事项详解
2019/05/29 Javascript
原生JavaScript之es6中Class的用法分析
2020/02/23 Javascript
[02:33]2018DOTA2亚洲邀请赛赛前采访——LGD
2018/04/04 DOTA
[01:01:01]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第一场 10.29
2020/10/29 DOTA
python二分法实现实例
2013/11/21 Python
python交互式图形编程实例(一)
2017/11/17 Python
Python字典,函数,全局变量代码解析
2017/12/18 Python
Python根据成绩分析系统浅析
2019/02/11 Python
Python编写合并字典并实现敏感目录的小脚本
2019/02/26 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
2019/06/19 Python
django orm模块中的 is_delete用法
2020/05/20 Python
python自动提取文本中的时间(包含中文日期)
2020/08/31 Python
喜诗官方在线巧克力店:See’s Candies
2017/01/01 全球购物
TripAdvisor土耳其网站:全球知名旅行社区,真实旅客评论
2017/04/17 全球购物
新大陆软件面试题
2016/11/24 面试题
2015年社区宣传工作总结
2015/05/20 职场文书
SQL Server连接查询的实用教程
2021/04/07 SQL Server
pycharm安装深度学习pytorch的d2l包失败问题解决
2022/03/25 Python