前端技能大挑战-3(修改this指向)
说题目之前先总结下call,apply,bind
共同点:
(1)改变this指向
(2)第一个参数都是this要指向的对象
(3)都可以利用后面传参
不同点:
(1)传参方式不同
(2)bind返回的是一个函数,仅仅this指向改变了,还需继续调用
例子(无参数情况)
var mr = { name: 'Mrc ', say: function () { console.log(this.name); } } var ty = { name: 'ty', say: function () { console.log(this.name); } }
call:
mr.say.call(ty)
apply:
mr.say.apply(ty)
bind:
mr.say.bind(ty)()
无参数情况下,call和apply用法一样
例子(有参数情况)
var mr = { name: 'Mrc ', say: function (sex,hobby) { console.log('姓名:' + this.name + ',性别:' + sex + ',爱好:' + hobby); } } var ty = { name: 'ty', say: function (sex,hobby) { console.log('姓名:' + this.name + ',性别:' + sex + ',爱好:' + hobby); } }
call:
mr.say.call(ty , '女' , '吃')
apply:
mr.say.apply(ty ,['女' , '吃'])
bind:
mr.say.bind(ty , '女' , '吃')()
或
mr.say.bind(ty)('女' , '吃')
接下来进入正题
题目描述
封装函数 f,使 f 的 this 指向指定的对象
function bindThis(f, oTarget) { //方法1 apply() return function(){ return f.apply(oTarget,arguments); }; //方法2 bind() return f.bind(oTarget); //方法3 call() return function(x,y){ return f.call(oTarget,x,y); };
}
为什么有匿名函数,是因为apply call 是绑定之后是立即调用的,
所以需要匿名函数包装且需要传入原函数的参数argumengts. bind 会创建一个新函数,即函数副本,绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。
所以想表达的意思是arguments不能省略