前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >javascript中bind绑定接收者与函数柯里化

javascript中bind绑定接收者与函数柯里化

作者头像
liulun
发布2019-07-15 14:57:14
4070
发布2019-07-15 14:57:14
举报
文章被收录于专栏:liulunliulun

如果我要遍历一个数组, 我只要给forEach传一个匿名函数即可,很简单;

let arr = ['a', 'b', 'c'];
arr.forEach((item, index) => { 
    console.log(item);
    console.log(index);
})

如果我已经把匿名函数抽象出来,做成了一个公共的方法 (可能其他地方也会用的到) 那么,这个遍历会是这样的;

let arr = ['a', 'b', 'c'];
let myFunc = (item, index) => {
    console.log(item);
    console.log(index);
}
arr.forEach(myFunc);

注意:只要把方法对象传给forEach就可以喽,参数什么的,根本就不用关心; 如果这个方法在一个对象里,那也没什么问题:

let obj = {
    add(param, index) {
        console.log(param);
        console.log(index)
    }
}
let arr = ['a', 'b', 'c'];
arr.forEach(obj.add);

但,如果涉及到对象的this,那就要出问题了:

let obj = {
    name: 'allen',
    add(param, index) {
        console.log(this.name);
        console.log(param);
        console.log(index)
    }
}
let arr = ['a', 'b', 'c'];
arr.forEach(obj.add);

输出:

undefined
a
0
undefined
b
1
undefined
c
2

这是因为,add方法执行的时候,this对象指向的并不是obj,而是forEach的对象,forEach的对象是全局对象golobal; 那想实现意图怎么办呢? 最low的办法就是给forEahc在套一个匿名函数

arr.forEach((item, index) => obj.add(item, index));

其次是给forEach方法再多传递一个参数:

arr.forEach(obj.add, obj);

这也不是什么好主意,forEach你可以多传一个obj进去,其他的类似forEach的方法,可不一定允许你多传一个对象进去哦! 更好的办法是:

arr.forEach(obj.add.bind(obj));

bind创建了一个新函数,这个函数跟obj.add一样,唯一不同的是,新函数把this绑定了obj 也就是说把add方法绑定给了接收者obj; 现在假设我们的add方法,还需要另外一个参数title,而且这是第一个参数:

add(title, param, index) {
        console.log(title);
        console.log(param);
        console.log(index)
}

那该如何是好呢? 你可以直接在bind方法里直接传递这个参数:

arr.forEach(obj.add.bind(obj, "mytitle"));

最终的代码是:

let obj = {
    add(title, param, index) {
        console.log(title);
        console.log(param);
        console.log(index)
    }
}
let arr = ['a', 'b', 'c'];
arr.forEach(obj.add.bind(obj, "mytitle"));

输出结果是:

mytitle
a
0
mytitle
b
1
mytitle
c
2

将函数与其参数的一个子集绑定的技术称为函数的柯里化; 比起显式的封装函数,这样做更简洁! (一般人也更不容易看懂你的代码,哈哈哈!)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-07-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档