this指向

this 是JavaScript语言的一个关键字。它代表函数运行时自动生成的一个内部对象,一般用在函数内部。随着函数使用场合的不同,this的指向会发生变化,但是有一个变化的规律,this指向函数的调用者。接下来,我们就针对每一种情况,详细讨论this的指向。

1.普通函数: 谁调用我 我的this就指向谁

2.箭头函数: 我在哪个函数 this就指向谁

默认指向在定义它时所处的对象 而不是执行时的对象
箭头函数实际并没有自己的this对象,其内部的this自动指向外层代码块的this
箭头函数不能使用call apply bind 改变this指向
3.匿名函数:

匿名函数的执行环境具有全局性,this对象通常指向window

4.定时器setTimeout,setInterval

定时器中回调函数的this都指向window

没有直接的调用者 this指向的是window

情况一:在全局作用域的函数中

在全局作用域中定义一个普通函数,这个普通函数就作为全局对象window的属性存在,因此this指向全局对象window。

其实在window中还可以划分出一个global对象,作为window的一部分,但是无法通过代码访问,也可以说this指向global

function fun(){
    console.log(this);
}
fun();

情况二:在字面量创建的对象中

this指向当前的对象

var obj = {
    fname: 'aaa',
    fun: function(){
        console.log(this.fname);  // aaa
        
    }   
}
obj.fun();

情况三:在构造函数中

this指向通过new关键字创建出的新对象

function Person(name){
    this.fname = name;
    this.play = function(){
        console.log(this.fname + 'Play Basketball!');
    }
}
var kb = new Person('kb ');
kb.play();  // kb Play Basketball!

如何改变this的指向?

通过三个方法改变this的指向:

  • call()
  • apply()
  • bind()

(1)使用call改变this的指向:调用call()方法时函数也会被执行,第一个参数是要指向的对象名,后面为向函数传递的实参

function fun(a, b){
    console.log(a+b);  // 3
    console.log(this);  // 原来指向window,现在指向obj
    
}
var obj = {
    fname: 'Hello'
}
fun.call(obj, 1, 2);

(2)使用apply改变this的指向:调用apply()方法时函数会被执行,第一个参数是要指向的对象名,向函数传递的实参包含在数组中

function fun(a, b){
    console.log(a+b);  // 3
    console.log(this);  // obj
}
var obj = {
    fname: 'Hello'
}
fun.apply(obj, [1, 2]);

(3)使用bind改变this的指向:调用bind()方法后会返回一个新函数,再调用新函数才会执行函数体,bind()的第一个参数是所要指向的对象,后面是向函数传递的实参(向函数传递的实参也可以在新函数调用时传)

function fun(a, b){
    console.log(a+b);   // 3
    console.log(this);  // obj
}
var obj = {
    fname: 'Hello'
}
// var fun2 = fun.bind(obj, 1, 2);
var fun2 = fun.bind(obj, 1);
fun2(2);

结论:

1.在全局环境下,this指向window
2.在函数里,this始终指向该函数的调用者(如果是多级调用,指向离该函数最近的调用者)
3.当通过new关键字生成构造函数的实例时,构造函数里的this指向这个新生成的实例
4.箭头函数里没有属于它自己this,this等于包裹箭头函数的外层环境的this,故这个外层环境被什么调用,箭头函数里的this就指向什么
5.this的指向可以通过call,apply,bind改变

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值