浅谈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 相关文章推荐
js+xml生成级联下拉框代码
Jul 24 Javascript
js猜数字小游戏的简单实现代码
Jul 02 Javascript
jquery easyui使用心得
Jul 07 Javascript
JS简单循环遍历json数组的方法
Apr 22 Javascript
Javascript OOP之面向对象
Jul 31 Javascript
实例详解display:none与visible:hidden的区别
Mar 30 Javascript
深入理解ES6学习笔记之块级作用域绑定
Aug 19 Javascript
AngularJs 禁止模板缓存的方法
Nov 28 Javascript
在Swiper内如何制作CSS3动画效果示例代码
Dec 07 Javascript
vuejs前后端数据交互之从后端请求数据的实例
Aug 11 Javascript
Javascript类型判断相关例题及解析
Aug 26 Javascript
jquery简易手风琴插件的封装
Oct 13 jQuery
封装的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_start函数的使用说明
2013/11/11 PHP
javascript some()函数用法详解
2014/11/13 PHP
ThinkPHP3.2.1图片验证码实现方法
2016/08/19 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
php 比较获取两个数组相同和不同元素的例子(交集和差集)
2019/10/18 PHP
查询绑定数据岛的表格中的文本并修改显示方式的js代码
2009/12/15 Javascript
jQuery中prop()方法用法实例
2015/01/05 Javascript
jQuery中end()方法用法实例
2015/01/08 Javascript
详解js图片轮播效果实现原理
2015/12/17 Javascript
JS实现响应鼠标点击动画渐变弹出层效果代码
2016/03/25 Javascript
Bootstrap php制作动态分页标签
2016/12/23 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
2017/02/05 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
2017/02/27 Javascript
js中this的指向问题归纳总结
2018/11/28 Javascript
Vue表单控件数据绑定方法详解
2020/02/05 Javascript
JavaScript实现随机点名小程序
2020/10/29 Javascript
[03:10]2014DOTA2 TI马来劲旅Titan首战告捷目标只是8强
2014/07/10 DOTA
python自动安装pip
2014/04/24 Python
python 不以科学计数法输出的方法
2018/07/16 Python
Python CVXOPT模块安装及使用解析
2019/08/01 Python
基于Python实现简单学生管理系统
2020/07/24 Python
python3.8动态人脸识别的实现示例
2020/09/21 Python
python实现图片,视频人脸识别(opencv版)
2020/11/18 Python
韩国休闲女装品牌网站:ANAIS
2016/08/24 全球购物
NBA德国官方网上商店:NBA Store德国
2018/04/13 全球购物
27个经典Linux面试题及答案,你知道几个?
2014/03/11 面试题
淘宝好评语大全
2014/05/05 职场文书
装饰工程师岗位职责
2014/06/08 职场文书
实现中国梦思想汇报2014
2014/09/13 职场文书
群众路线自我剖析及整改措施
2014/11/04 职场文书
2014年仓库管理员工作总结
2014/11/18 职场文书
党员转正党支部意见
2015/06/02 职场文书
2016新党章学习心得体会
2016/01/15 职场文书
Pytest allure 命令行参数的使用
2021/04/18 Python
Python简易开发之制作计算器
2022/04/28 Python
Ubuntu安装Mysql+启用远程连接的完整过程
2022/06/21 Servers