函数内部的this指向 call() apply() bind()改变this指向

1.函数内部的this指向:

this对象依赖于上下文,大多数情况下this对象取决于谁调用了此函数。

  • 在方法中,this 指的是所有者对象;
var person = {
    name:"Tom";
    outName:function(){
        return this.name;  //Tom
    }
}
  • 在单独情况下,this 指的是全局对象;
var x=this; //Window
  • 在函数中,this 指的是全局对象
function myFunction(){
    return this;  //Window
}
  • 在函数中,严格模式下,this 是undefined;
"use strict";
function myFunction(){
    return this;  //undefined
}
  • 在事件中,this 指的是接收事件的元素。
<button onclick="this.style.display='none'">单击来删除我!</button>  //当点击这个按钮时,按钮会消失

2.改变函数内部this指向

call()方法:
call()改变this指向:
call()方法调用一个对象。可以简单理解为调用函数的方式,但是它可以改变函数的 this 指向
应用场景:经常做继承;

//call可以调用函数 
//call可以改变函数内部的this指向 
//使用call方法传递参数使用逗号隔开 
//call方法一般应用于继承 
var person = {
        name:"Tom"
    };
function outName(a, b) { 
console.log("call()");
console.log(this); 
console.log(a+b) }; 
outName(1,2);  // 此时的this指向的是window 运行结果为3 
outName.call(person,1,2);  //此时的this指向的是对象person,参数使用逗号隔开,运行结果为3

在这里插入图片描述

apply()方法:
apply() 方法调用一个函数。简单理解为调用函数的方式,但是它可以改变函数的 this 指向。
应用场景: 经常跟数组有关系。

//apply可以调用函数
//apply可以改变函数内部的this指向
//使用apply方法传递参数使用数组传递
//apply方法一般应用于操作数组数据
var person = {
        name:"Tom"
    };
    function outName(a,b) {
    	console.log("apply()");
        console.log(this);
        console.log(a+b);
    };
    outName(1,2);  // 此时的this指向的是window 运行结果为3
    outName.apply(person,[1,2]);  //此时的this指向的是对象person,参数使用数组传递 运行结果为3

在这里插入图片描述
bind()方法:
bind() 方法不会调用函数,但是能改变函数内部this 指向,返回的是原函数改变this之后产生的新函数;
如果只是想改变 this 指向,并且不想调用这个函数的时候,可以使用bind;
应用场景:不调用函数,但是还想改变this指向。

//bind不会调用原来的函数   可以改变原来函数内部的this 指向
//返回的是原函数改变this之后产生的新函数
//应用场景:如果有的函数我们不需要立即调用,但是又想改变这个函数内部的this指向此时用bind
var person = {
        name:"Tom"
    };
    function outName(a,b) {
        console.log("bind");
        console.log(this);
        console.log(a+b);
    };
    var out = outName.bind(person,1,2);  //此处的 out 是bind返回的新函数
    out(); //调用新函数  this指向的是对象person 参数使用逗号隔开

在这里插入图片描述
call() apply() bind()三者的异同:
相同点:都可以改变this的指向;

不同点:

  1. call和apply都会调用函数,并改变函数内部this指向;
  2. call传递参数使用逗号隔开传递,apply传递参数使用数组传递;
  3. bind 不会调用函数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值