这个题主要考察call()、bind()、apply()的用法,改变this的指向,区别在于
f.call(obj, arg1, arg2...)
f.bind(obj, arg1, arg2,...)()
f.apply(obj, [arg1, arg2, .])
注意:
bind 返回的是一个新的函数,你必须调用它才会被执行(把对象和函数绑定死);
call和apply不会产生新的函数,只是在调用时,绑定一下而已;
call和apply的区别:第一个参数都是要绑定的this,apply第二个参数是数组(是函数的所有参数),call把apply的第二个参数单列出来
对于这个题需要做两件事:
1)使f的this指向指定对象⇔函数调用时,使其执行上下文为对象⇔使对象将函数作为其方法调用
2)对象在调用函数时,需要传入函数所需的形参
// 声明
function callback(arg1, arg2){}
function Func(callback){
return function(){
// 在该层封装函数中使用arguments对象取callback形参
}
}
// 调用
Func(callback)('形参1','形参2')
实现:
// 方法一:apply
function bindThis(f, oTarget) {
return function() {
let args = [].slice.call(arguments)
return f.apply(oTarget,args)
}
}
// 方法二:call
function bindThis(f, oTarget) {
return function() {
let args = [].slice.call(arguments)
return f.call(oTarget,...args)
}
}
// 方法三:bind
function bindThis(f, oTarget) {
return f.bind(oTarget)
}
// 方法四:将函数作为对象的方法调用
function bindThis(f, oTarget) {
// 使用call、apply、bind方法时,该函数是添加到对象原型上的
// oTarget.__proto__.fn = f
oTarget.fn = f
return function(){
let args = [].slice.call(arguments)
return oTarget.fn(...args)
}
}