浅谈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 CSS修改学习第三章 修改样式表
Feb 19 Javascript
JavaScript中的onerror事件概述及使用
Apr 01 Javascript
Jquery Uploadify多文件上传带进度条且传递自己的参数
Aug 28 Javascript
详细解读AngularJS中的表单验证编程
Jun 19 Javascript
css如何让浮动元素水平居中
Aug 07 Javascript
Angular2 (RC4) 路由与导航详解
Sep 21 Javascript
微信小程序内拖动图片实现移动、放大、旋转的方法
Sep 04 Javascript
spring+angular实现导出excel的实现代码
Feb 27 Javascript
vue-cli3+ts+webpack实现多入口多出口功能
May 30 Javascript
微信小程序商品详情页底部弹出框
Nov 22 Javascript
Javascript实现关闭广告效果
Jan 29 Javascript
关于vue-router-link选择样式设置
Apr 30 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中ob(Output Buffer 输出缓冲)函数使用方法
2007/07/21 PHP
使用bcompiler对PHP文件进行加密的代码
2010/08/29 PHP
浅析PHP递归函数返回值使用方法
2013/02/18 PHP
php通过正则表达式记取数据来读取xml的方法
2015/03/09 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
2015/12/11 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
javascript 对象的定义方法
2007/01/10 Javascript
Javascript 调试利器 Firebug使用详解六
2009/07/05 Javascript
各浏览器对click方法的支持差异小结
2011/07/31 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
查找页面中所有类为test的结点的方法
2014/03/28 Javascript
JS代码随机生成姓名、手机号、身份证号、银行卡号
2016/04/27 Javascript
Sea.JS知识总结
2016/05/05 Javascript
jQuery实现的简单分页示例
2016/06/01 Javascript
基于javascript实现的购物商城商品倒计时实例
2016/12/11 Javascript
Vue生命周期示例详解
2017/04/12 Javascript
jquery ajaxfileupload异步上传插件
2017/11/21 jQuery
JavaScript实现微信号随机切换代码
2018/03/09 Javascript
js实现按钮开关单机下拉菜单效果
2018/11/22 Javascript
JS数组求和的常用方法实例小结
2019/01/07 Javascript
Vue自定义属性实例分析
2019/02/23 Javascript
Python自动扫雷实现方法
2015/07/25 Python
python WindowsError的错误代码详解
2017/07/23 Python
Linux下python3.7.0安装教程
2018/07/30 Python
Python爬虫:将headers请求头字符串转为字典的方法
2019/08/21 Python
Python简单实现词云图代码及步骤解析
2020/06/04 Python
利用django创建一个简易的博客网站的示例
2020/09/29 Python
Pat McGrath Labs官网:世界上最有影响力的化妆师推出的彩妆品牌
2018/01/07 全球购物
美国领先的家庭智能音响系统品牌:Sonos
2018/07/20 全球购物
Happy Plugs官网:瑞典无线耳机品牌
2020/07/16 全球购物
小学新教师培训方案
2014/02/03 职场文书
社区交通安全实施方案
2014/03/22 职场文书
乡镇民主生活会发言材料
2014/10/20 职场文书
民事起诉状范文
2015/05/19 职场文书
2016春季幼儿园开学寄语
2015/12/03 职场文书
初一数学教学反思
2016/02/17 职场文书