浅谈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模板技术
Apr 27 Javascript
js中根据字数截取字符串,不能截断url
Jan 12 Javascript
showModalDialog模态对话框的使用详解以及浏览器兼容
Jan 11 Javascript
javascript window.open打开新窗口后无法再次打开该窗口问题的解决方法
Apr 12 Javascript
JS解析XML实例分析
Jan 30 Javascript
jquery中ajax处理跨域的三大方式
Jan 05 Javascript
jquery radio的取值_radio的选中_radio的重置方法
Sep 20 Javascript
关于vue的语法规则检测报错问题的解决
May 21 Javascript
解决element-ui中下拉菜单子选项click事件不触发的问题
Aug 22 Javascript
Preload基础使用方法详解
Feb 03 Javascript
Javascript模拟实现new原理解析
Mar 03 Javascript
vue实现input输入模糊查询的三种方式
Aug 14 Vue.js
封装的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
PHP 中的一些经验积累
2006/10/09 PHP
模仿OSO的论坛(一)
2006/10/09 PHP
thinkphp中字符截取函数msubstr()用法分析
2016/01/09 PHP
Laravel5.1 框架数据库操作DB运行原生SQL的方法分析
2020/01/07 PHP
js传值 判断
2006/10/26 Javascript
jquery 图片轮换效果
2010/07/29 Javascript
capacityFixed 基于jquery的类似于新浪微博新消息提示的定位框
2011/05/24 Javascript
深入理解js数组的sort排序
2016/05/28 Javascript
浅谈window.onbeforeunload() 事件调用ajax
2016/06/29 Javascript
如何利用JSHint减少JavaScript的错误
2016/08/23 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
AngularJS中的拦截器实例详解
2017/04/07 Javascript
简单明了区分escape、encodeURI和encodeURIComponent
2018/05/26 Javascript
JS实现简单的星期格式转换功能示例
2018/07/23 Javascript
vue-router 前端路由之路由传值的方式详解
2019/04/30 Javascript
python之matplotlib学习绘制动态更新图实例代码
2018/01/23 Python
python之文件读取一行一行的方法
2018/07/12 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
Python3.0 实现决策树算法的流程
2019/08/08 Python
Python爬虫使用代理IP的实现
2019/10/27 Python
python之生成多层json结构的实现
2020/02/27 Python
python:删除离群值操作(每一行为一类数据)
2020/06/08 Python
深入浅析python 中的self和cls的区别
2020/06/20 Python
python实现自动打卡的示例代码
2020/10/10 Python
CSS3实现时间轴特效
2020/11/02 HTML / CSS
东南亚旅游平台:The Trip Guru
2018/01/01 全球购物
C/C++ 笔试、面试题目大汇总
2015/11/21 面试题
销售工作岗位职责
2013/12/24 职场文书
青年教师培训方案
2014/02/06 职场文书
大专生毕业的自我评价
2014/02/06 职场文书
会计专业毕业自荐书范文
2014/02/08 职场文书
论文诚信承诺书
2014/05/23 职场文书
2015年网络舆情工作总结
2015/07/24 职场文书
python 自动化偷懒的四个实用操作
2021/04/11 Python
使用logback实现按自己的需求打印日志到自定义的文件里
2021/08/30 Java/Android
JVM之方法返回地址详解
2022/02/28 Java/Android