我有没有搞懂this?

193 阅读2分钟

本来以为this很简单 无非是这样

结果为:我是ojb this指向obj对象 真easy ,后面发现有很多变态的刁钻的情况,例如
我还以为this会是指向周小小杰伦的上一层:也就是周小杰伦 ,结果答案是window.惊了 让我有点搞不懂了.

后来经过仔细研究,总结了一下某些this指向的问题,让思路更加清晰
总的来说函数的调用有两个方法

    func()/window.func()
    func.call(ojb)

其实obj.func()也是跟func()这种调用是一样的 只不过func()前面省略了window,全写完就是window.func() 当我们用第二种方法去调用函数的时候 this的指向就非常清晰了

func.call(obj)

里面的this就是obj 传什么进去this就指向什么,obj可能是对象,其实也有可能是对象,函数,甚至是字符串,数字,字符串数字在js里面其实也可以算个对象,万物皆对象,虽然直接不可用给string或者number加属性,但是给原型加了之后string和number是依然可以用的,举个栗子

言归正传.用这样子去调用函数的话 this的指向可谓是非常清晰,假如是a.b.c(),那么改成call的写法,就是a.b.c.call(a.b),那么this就是指向a.b,哇 简直是简单粗暴,那么问题就来了

前面这张图的情况怎么办捏,用了箭头函数,箭头函数是没有this的,他用的是上下文的this,这tmd就很尴尬了,周小小杰伦这个函数的上下文的this是啥玩意呢,这个情况它不像这样
这样就好理解,箭头函数是没有this,其实就是拿的作用域里面的this,也就是函数外一层的this,我是这么理解的. 所以回到之前的周小小杰伦的箭头函数里面的this指向什么呢,不知道,因为上下文没有this,所以呢,就是window,事实也证明,搞不清楚的情况就把锅甩window就行了 .

所以 this的指向就是call的第一个参数.

ppps:(此规则暂不适用于一些奇怪的东西,比如new出来的情况,如果箭头函数的话还得仔细找上下文的this)