思路:call()、bind()、apply()的用法,改变this的指向,区别在于:f.bind(obj, arg1, arg2,...)(),bind()方法创建一个新的函数,故需要自己调用;f.call(obj, arg1, arg2...),call()方法在调用函数后会返回函数的执行结果,call可以接受多个参数;f.apply(obj, [arg1, arg2, .]),apply()方法在调用函数后会返回函数的执行结果,apply可以接受一个数组参数列表。故bind直接返回f.bind(oTarget),其本身是一个函数;而call和apply需要返回一个使用function (){}包裹的匿名函数,其中还需要传递参数arguments,其中call是析构...arguments,而apply是直接传递数组arguments。

function bindThis(f, oTarget) {
    //call()、bind()、apply()的用法,改变this的指向,区别在于
    //f.call(obj, arg1, arg2...),
    //call() 和 apply() 方法在调用函数后会返回函数的执行结果
    //return function(){
    //    return f.call(oTarget,...arguments)
    //}
    //bind() 方法创建一个新的函数
    //f.bind(obj, arg1, arg2,...)(),
    //return f.bind(oTarget)
    //f.apply(obj, [arg1, arg2, .])
        return function(){
        //以匿名函数形式返回 返回的是函数 如果后面加括号就变成了立即执行函数
        return f.apply(oTarget,arguments)
    }
}

总结:call()、bind()、apply()的用法,改变this的指向,区别在于:f.bind(obj, arg1, arg2,...)(),bind()方法创建一个新的函数,故需要自己调用;f.call(obj, arg1, arg2...),call()方法在调用函数后会返回函数的执行结果,call可以接受多个参数;f.apply(obj, [arg1, arg2, .]),apply()方法在调用函数后会返回函数的执行结果,apply可以接受一个数组参数列表。