若是我要遍历一个数组,
我只要给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就能够喽,参数什么的,根本就不用关心;
若是这个方法在一个对象里,那也没什么问题:this
let obj = { add(param, index) { console.log(param); console.log(index) } } let arr = ['a', 'b', 'c']; arr.forEach(obj.add);
但,若是涉及到对象的this,那就要出问题了:code
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在套一个匿名函数it
arr.forEach((item, index) => obj.add(item, index));
其次是给forEach方法再多传递一个参数:console
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
将函数与其参数的一个子集绑定的技术称为函数的柯里化; 比起显式的封装函数,这样作更简洁! (通常人也更不容易看懂你的代码,哈哈哈!)