普通函数与箭头函数的this指向

普通函数与箭头函数的this指向

普通函数的this指向

哪个对象调用的函数,函数的this就指向谁,否则指向全局,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁

如:在这里插入图片描述

一.this的默认指向

例一:
在这里插入图片描述
在这里插入图片描述

fn()是wendow调用的,其实就等于window,fn(),由于调用这个函数的对象是window,所以this指向window运行结果如下
例二:

在这里插入图片描述
第一个function里面的this指向obj,由于第二个函数的调用者是window即window.test(),所以里面的this指向window,故他的结果也是window
例三:
在这里插入图片描述
因为当前this指向的为window,所以应该去window对象下面找a, 所以this.a打印出的结果为0
例四:
在这里插入图片描述
因为调用foo的对象是obj,所以var that=this中的this指向的是obj,将它赋值给了that,所以that.a就等于obj.a,所以结果就是2.
例五:
在这里插入图片描述
在这里插入图片描述
例六:
在这里插入图片描述
在这里插入图片描述
例七:
立即执行函数的this指向window对象,如果要修改立即执行函数里面的this指向,可以通过立即执行函数传参代码如下:
在这里插入图片描述
在这里插入图片描述

二.this的隐式绑定

在这里插入图片描述
在这里插入图片描述

三.隐式丢失this指向的5种情况

例一:
在这里插入图片描述
结果为0
例二
在这里插入图片描述
结果为0
例三
在这里插入图片描述
在这里插入图片描述

例四
在这里插入图片描述
结果为10
例五
在这里插入图片描述

例六
在这里插入图片描述
例七
在这里插入图片描述
结果为:2 2 2
例八
在这里插入图片描述
在这里插入图片描述

例九
在这里插入图片描述
在这里插入图片描述

例十
在这里插入图片描述
在这里插入图片描述

四.New绑定

例一
在这里插入图片描述
在这里插入图片描述

例二
在这里插入图片描述
在这里插入图片描述

五.严格模式

在这里插入图片描述
在这里插入图片描述
在非严格模式中call和apply第一个参数为null/undefined,函数this指向全局对象,在浏览器中是window,在node中是global
在严格模式中(ie 6/7/8/9 除外),传入null/undefined,this不指向全局对象,而是null/undefined本身

箭头函数的this指向

箭头函数不会创建自己的this,它只会从自己的作用域链的上一层继承this
例一:

function Person(){
    this.age = 0;
 
    setTimeout(() => {
        this.age++; // this 指向 Person
        console.log(this);   //指向Person ,且age=1
    }, 1000);
}
 
var p = new Person();
console.log(p);             //指向Person ,且 age=0

例二:

var obj = {
    say: function () {
        setTimeout(() => {
            console.log(this)
        });
    }
}
obj.say(); // obj

例三

var obj = {
    say: function () {
      var f1 = () => {
        console.log(this); // obj
        setTimeout(() => {
          console.log(this); // obj
        })
      }
      f1();
    }
  }
  obj.say()

例四

var obj = {
    say: function () {
      var f1 = function () {
        console.log(this);    // window, f1调用时,没有宿主对象,默认是window
        setTimeout(() => {
          console.log(this); // window
        })
      };
      f1();
    }
  }
  obj.say()

例五

//1
var x=1;
var obj={
    x:2,
    say:()=>{
        console.log(this);     // window
        console.log(this.x);   // 1
    }
}
obj.say();
 
//2
var a=3;
function test(){
    this.a=4;
    var fn=()=>{
        console.log(this);      //test
        console.log(this.a)     //4
    }
    fn();
}
var x=new test();
 
//3
var b=5;
function test2(){
    this.b=6;
    let func=()=>{
        console.log(this);     //window
        console.log(this.b)    //6
    }
    func();
}
test2();

第一个:ES6中定义的时候绑定this的继承的是父执行上下文里面的this,普通对象(非函数是没有执行上下文的),因此第一个的this指向了window

第二个:this指向new出来的对象,即test

第三个:test2() 没有任何前缀,类似于全局函数,即 window.test2调用,所以此时调用的时候, this指的是window,

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白嫖leader

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值