javaScript -- 修改this指向

本文介绍三种实现函数this绑定的方法:apply(), call() 和 bind()。并详细解释了每种方法的工作原理及其区别,帮助读者理解如何在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在复制时改变,其他两个在调用时改变)
参数传递时机不同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值