改变this指向

文章比较了箭头函数与普通函数中this的指向特性,指出箭头函数this固定,不受call,apply,bind影响。同时详细解释了call和apply的传参规则以及bind的作用。
摘要由CSDN通过智能技术生成

箭头函数

箭头函数的this指向和调用无关,它定义时的环境已经决定了它的指向,后面不能被改变,使用call,apply,bind都不能使其改变,箭头函数本身没有this,只不过拿外层的this来用 

<script>
        const f=()=>{
            console.log(this); 
        }
        f() //指向Window
        f.call(222) //指向Window
        f.apply("yy") //指向Window
</script>

普通函数

普通函数的this指向可以通过call,apply,bind去改变,this的指向可以改成任意的东西,比如:Window,字符串,对象,日期,数字等等

需要注意的是,call和apply会自动执行参数,而bind需要添加一个(),才会去执行这个函数

<script>
        function ff(){
            console.log(this);
        }
        ff() //指向Window
        ff.call('nihao') //指向'nihao'

        let obj2={
            name:'she'
        }
        
        ff.call(obj2) //指向obj2
        ff.apply(new Date()) //指向日期
        ff.bind(666)() //指向数字666

        let obj1={
            name:'Jay',
            fn:function(age,sex){
                console.log(this.name+`今年${age}岁,性别${sex}`);
            }
        }
        // 当传的参数不止this的指向这一个时,call和apply在传参形式上不一样,
        // apply需要用[]包裹,bind的传参形式和call一样
        obj1.fn.call(obj2,18,'女') //因为改变了fn的this指向,指向obj2,下面同理,所以此时输出:she今年18岁,性别女
        obj1.fn.apply(obj2,[24,'女']) // she今年24岁,性别女
        obj1.fn.bind(obj2,33,'男')() // she今年33岁,性别男

</script>

当传的参数不止this的指向这一个时,call和apply在传参形式上不一样,apply需要用[]包裹,bind的传参形式和call一样,不需要用[]

<script>
        let obj1={
            name:'Jay',
            fn:function(age,sex){
                console.log(this.name+`今年${age}岁,性别${sex}`);
            }
        }

        let obj2={
            name:'she'
        }
        
        obj1.fn.call(obj2,18,'女') //因为改变了fn的this指向,指向obj2,下面同理,所以此时输出:she今年18岁,性别女
        obj1.fn.apply(obj2,[24,'女']) // she今年24岁,性别女
        obj1.fn.bind(obj2,33,'男')() // she今年33岁,性别男

</script>

如果本文对你有帮助,希望能得到你的点赞或收藏或关注,这是对我最好的鼓励;

如你有问题或疑惑,欢迎在评论区写下,必将努力解答;

如本文有误区,希望你不吝赐教,让我们共勉!

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值