bind&currying
1. bind
- 基本用法
bind()是ECMAScript5中新增的方法,这个方法主要作用是将函数绑定至某个对象。当在函数f()上调用bind()方法并传入一个对象o作为参数,这个方法将返回一个新函数,这个新函数与原函数f()的区别仅仅是this参数指向了一个特定对象o。
实例如下:
function f(y){
return this.x + y;
}
var obj = {x: 1};
var newFun = f.bind(obj);
newFun(2);//=>3
模拟基本用法:
if(!Function.prototype.bind){
Function.prototype.bind = function(/*o*/){
var obj = arguments[0];
var selfFun = this;
return function(/*args*/){
return selfFun.apply(obj, arguments);
};
};
}
function f(y){return this.x + y}
var obj = {x: 1};
var newFun = f.bind(obj);
console.log(newFun(2));//=>3
- currying
什么是柯里化?如果你固定一个函数的某些参数,将得到接受余下参数的一个新函数。ECMAScript5中得bind()方法不仅仅能够将某个函数中的this绑定至特定对象,还可以将函数的形参绑定到特定值。bing()的这种应用方式成为柯里化(curring)。
例子如下:
var sum = function(x, y){return x + y + this.z};
var obj = {z: 1};
var newFun = sum.bind(obj, 1);
console.log(newFun(1));//=>3
模拟currying用法:
if(!Function.prototype.bind){
Function.prototype.bind = function(/*o, args*/){
//保存要绑定的函数
var selfFun = this;
//保存绑定的实参
var obj = arguments[0];//将第一个参数绑定到this
var boundArgs = arguments;//将后面的参数绑定到函数的前面几个参数
//bind方法返回一个函数(闭包)
//这个闭包要访问外部函数中的selfFun, boundArgs, obj.
return function(/*argsLeft*/){
var args = [];//创建实参数组
var i;
for(i = 1; i < boundArgs.length; i++){//push绑定的实参
args.push(boundArgs[i]);
}
for(i = 0; i < arguments.length; i++){//push剩余实参
args.push(arguments[i]);
}
//闭包内要访问外部函数内定义的变量
return selfFun.apply(obj, args);
};
}
}
function sum(x, y){return x + y + this.z};
var obj = {z: 1};
var newFun = sum.bind(obj, 1);
console.log(newFun(1));//=>3
bind&currying的更多相关文章
- call, apply && bind, currying
简要概括: apply(): 将函数作为指定对象的方法来调用,传递给它的是指定的参数数组 ——function.apply(thisobj, args) 或者 function.apply(thiso ...
- Currying 及应用
Currying,中文多翻译为柯里化,感觉这个音译还没有达到类似 Humor 之于幽默的传神地步,后面直接使用 Currying. 什么是 Currying Currying 是这么一种机制,它将一个 ...
- 【转载】JS中bind方法与函数柯里化
原生bind方法 不同于jQuery中的bind方法只是简单的绑定事件函数,原生js中bind()方法略复杂,该方法上在ES5中被引入,大概就是IE9+等现代浏览器都支持了(有关ES5各项特性的支持情 ...
- 前端开发者进阶之函数柯里化Currying
穆乙:http://www.cnblogs.com/pigtail/p/3447660.html 在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化,是把接受多个参数的函数变换成接 ...
- js里function的apply vs. bind vs. call
js里除了直接调用obj.func()之外,还提供了另外3种调用方式:apply.bind.call,都在function的原型里.这3种方法的异同在stackoverflow的这个答案里说的最清楚, ...
- javascript-this,call,apply,bind简述3
上节介绍了call()和apply()的用法,这节再讨论一下arguments参数和bind函数的用法以及函数柯里化就算是完结了. bind()函数 先看定义: bind()方法会创建一个函数的实例, ...
- std::function,std::bind
std::function 和 std::bind 标准库函数bind()和function()定义于头文件中(该头文件还包括许多其他函数对象),用于处理函数及函数参数.bind()接受一个函数(或者 ...
- 《Web 前端面试指南》2、JavaScript 的 Bind 函数进阶
使用 Bind() 设置方法中 this 对象 //<button>获取随机的人</button> //<input type="text"> ...
- angular.bind
angular.bind :Returns a function which calls function fn bound to self (self becomes the this for fn ...
随机推荐
- LINUX第三次实践:程序破解
LINUX第三次实践:程序破解 标签(空格分隔): 20135328陈都 一.掌握NOP.JNE.JE.JMP.CMP汇编指令的机器码 NOP:NOP指令即"空指令".执行到NOP ...
- sring引入mybatis
1.首先框架结构是这样的(jar包还是要导的) 2.web.xml和springMVC-servlet.xml未作任何新的配置,这里简单贴一下代码: <?xml version="1. ...
- Maven入门指南④:仓库
1 . 仓库简介 没有 Maven 时,项目用到的 .jar 文件通常需要拷贝到 /lib 目录,项目多了,拷贝的文件副本就多了,占用磁盘空间,且难于管理.Maven 使用一个称之为仓库的目录,根据构 ...
- Docker 部署Gitlab
sudo docker run -d \ -h 192.168.16.88 \ -p 89:80 -p 23:22 \ --name gitlab \ --restart always \ --vol ...
- CentOS 关闭烦人的屏保
1. VNC连接到服务器 2.打开 system tools - settings 在power处 将 Power Saving 设置改一下
- MES模块
基础数据管理:产品模型.工厂模型.工艺模型 仓储管理 成本管理 绩效管理 看板管理 日志管理 设备管理:工装管理.设计器具管理.设备保养管理.设备备件管理.设备采集管理.设备点检管理.设备故障管理.设 ...
- poj 3352 Road Construction(边双连通分量+缩点)
题目链接:http://poj.org/problem?id=3352 这题和poj 3177 一样,参考http://www.cnblogs.com/frog112111/p/3367039.htm ...
- spark中saveAsTextFile的错误
写了很简单的一段spark代码,将结果保存为windows本地文件,执行之后总是报错NullPointerException 查询之后 发现是本地缺少hadoop需要的一个文件所致 如果本地已经安装了 ...
- jmeter创建数据库测试计划
这个例子要:创建50个用户发送2个sql请求到数据库服务器, 也可设置用户重复执行100次,这样总的请求数=50*2*100 用到以下元素:thread group / jdbc request / ...
- 关于RabbitMQ Queue Argument的简介
1.Message TTL message在队列queue中可以存活多长时间,以毫秒为单位:发布的消息在queue时间超过了你设定的时间就会被删除掉. channel.queueDeclare(&qu ...