javaScript -- 修改this指向

题目描述

封装函数 f,使 f 的 this 指向指定的对象

//为什么要使用匿名函数?
1、如果不使用匿名函数,那么 arguments 获取的就是 bindThis()的实参数组。
2、因为apply call 是绑定之后是立即调用的,所以需要匿名函数包装且需要传入原函数的参数argumengts. bind 会创建一个新函数,即函数副本,绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。
//方法一:使用apply()
function bindThis(f, oTarget) {
    
    
  return function(){
    
    
       //var args = Array.prototype.slice.call(arguments);
        return f.apply(oTarget,arguments);
    }
}
//方法一:使用call()
//因为call()方法接收的是参数列表而不是数组,所以不能直接使用arguments
function bindThis(f, oTarget) {
    
    
   return function(a,b){
    
    
        return f.call(oTarget,a,b);
    }
}
//方法三:使用bind()
function bindThis(f, oTarget) {
    
    
        return f.bind(oTarget);
}

扩展:apply()、call()、bind()的区别:

apply()与call(): apply()、call()的作用相同,区别在于接收的参数不同。它们接收的第一个参数都是this,但在apply()方法的第二个参数是数组或arguments对象,而在使用call()方法时,必须把所有参数都列举出来。它们都能扩充函数赖以运行的作用域,在特定的作用域中调用函数,实际上就是改变函数体内this对象的值。

bind(): 该方法会创建一个函数的实例,其this值会被绑定给传到bind()函数的值;即了一个可以将函数绑定到指定环境的函数。只有一个参数。

相同点:
1、都能改变this指向
2、都能传递参数
3、都能通过方法"."方法名调用

不同点:
1、函数名不同
2、参数传递方式不同
3、改变this指向的时机不同(bind在复制时改变,其他两个在调用时改变)
参数传递时机不同

猜你喜欢

转载自blog.csdn.net/sanjun_done/article/details/114802434
今日推荐