JS-This判断归属

js函数中this取何值,只有在函数调用时才确定的,定义的时候确定不了,因为this属于执行上下文环境中的一部分,而执行上下文环境在函数每次调用的时候可能都不一样

情况1:new Function() 和普通调用

当一个函数作为构造函数使用时,函数执行时,this为new出来的对象。严格的说所有的函数都可以用作构造函数,都可以new出一个对象

  function Test() {
      this.name = "lly"
      this.age = 27;
      console.log(this);//Test{name:"lly", age: 27}
  }

  let obj = new Test();

此处this仅在new Test()情况下适用,当被当做普通函数使用时,则按下面的情况分析

情况2:作为对象属性和对象属性赋值给别的对象(包括window)情况

(1).当作为对象的属性,且被该对象调用时,则this为该对象

(2).当把该对象的属性赋值给了其他对象,则this为该调用的对象

    let x = 20;
    let obj1 = {
        "x": 100,
         "fn": function () {
              console.log(this);
              console.log(this.x);
          }
    }

    let obj2: any = {
        "x": 200
    };

    obj2.fn = obj1.fn;
    let fn = obj1.fn;

    obj1.fn();//obj1, 100
    obj2.fn();//obj2, 200
    fn(); //window, 20

情况3:函数使用call,aplay

使用这两种方式调用的函数,this为传入的第一个参数指向的内存,call后面的参数列表(一一填入),而aplay后面的参数为数组

let obj = {
    "x" : 10
}

let fn = function(){
    console.log(this);//obj 
    console.log(this.x);//10
}

fn.call(obj,p1,p2,p3);或者fn.aplay(obj,[p1,p2,p3])

情况4:全局函数,包括在函数内创建的函数(也是全局函数)

原来错误理解:原以为在函数1内创建的函数2,使用函数2时,this必为函数1中的this

1.在对象函数中定义的函数,并不属于该对象的属性(使用obj.fun报错,因为不是),所以该函数运行时this并非就是该对象(情况2也有可能不是该对象),具体看怎么调用,如果使用bind,或aplay那没得说

2.如果不是对象中的函数,又没有bind,aplay,也没有把该函数赋值给谁(情况2otherObj.fun = fun  otherObj.fun()),则该函数中的this应该是window(隐式的window.)

3.总结情况4,不是对象中的属性函数,属于全局函数,调用时再能确定,赋值给哪个对象this就是哪个对象,如果没有赋值,则为window

 

情况2图解:解析为何当obj1的函数赋值给了obj2之后,this是obj2,函数在堆中有自己的内存,obj1.fn只是obj1调用了该内存,此时this为obj1,当obj2.fn是用obj2调用了该内存,所以this为obj2()

总结:谁使用了该函数内存,this就是谁,如果没有obj.fn的,则this皆为window

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值