我真的懂 this 吗

2019-04-03  本文已影响0人  加油吧_

先知

this 实际上是在函数被调用时发生的绑定,它指向哪里完全取决于函数在哪里被调用。

大提示: 不想看分析的可以直接拉到最后看结论。

面试常见题

第一题

function foo(){
  console.log(this.a)
}
var obj = {
  a :2,
  foo:foo
}
var bar = obj.foo
obj.foo() 
bar()  

问: 最后两个打印出什么?

第二题

function foo(){
  console.log(this.a)
}
var obj = {
  a :2,
  foo:foo
}
var obj2 = {
  a:1,
  obj:obj
}
var obj3 = obj2.obj.foo
obj2.obj.foo() // 2
obj3() //undefined

问: 最后两个打印出什么?
答?

我们如何理解 this 绑定的到底是谁?或者说 this 到底是谁?下面介绍四种方法

1. 默认绑定

什么是默认绑定呢?上代码先

var a = 2;
function foo(){
  console.log(this.a)
}
function foo2(){
  'use strict'
  console.log(this.a)
}
foo() // 2
foo2() //  TypeError: Cannot read property 'a' of undefined

2. 隐式绑定

隐式绑定是什么呢?隐式的绑定

当函数引用有上下文对象时,隐式绑定会把函数调用中的 this 绑定到这个上下文对象。

那么回到面试题

2.1 面试题一
function foo(){ console.log(this.a)}
var obj = { a :2,  foo:foo }
var bar = obj.foo
obj.foo() //2
bar()  /undefined

foo() 被调用时,落脚点指向 obj 对象(上下文对象),所以 this 绑定到 obj ,this.a 即 obj.a , 所以打印出了 2

但是为什么 bar() 打印出了 undefined 呢?

虽然 bar 是 obj.foo 的引用,但实际上是 foo函数 本身的引用,所以此时 bar() 是不带任何修饰的函数调用,使用默认调用

2.2 面试题二
function foo(){ console.log(this.a)  }
var obj = {  a :2,  foo:foo  }
var obj2 = {  a:1,  obj:obj   }
var obj3 = obj2.obj.foo
obj2.obj.foo() // 2
obj3() //undefined

跟上面一题相同,虽然引用链比较长,但是最后 foo() 是在 obj 中被调用,所以 this 绑定到 obj ,引用链只有最后一层影响调用位置。

隐式绑定总结 : 函数在上下文对象中调用时, this 绑定到 上下文对象上。

3. 显式绑定

使用「 call apply bind 」 进行绑定 this , this 绑定到第一个传入的参数

MDN三者的用法

3.1 call 的使用

回到面试题第一题,我们使用「 call 」进行显式绑定

function foo(){ console.log(this.a)  }
var obj = {
  a :2,
  foo:foo
}
var bar =obj.foo
obj.foo() // 2
bar.call(obj) //2

此时两者都打印出 2 ,因为我们将 this 绑定到 obj ,打印出的即是 //obj.a //2

3.2 apply 绑定第一个参数是 this , 二参是 一个数组
3.3 bind 是 绑定第一个参数是 this

显式绑定总结: 使用call apply bind 时,第一个参数是 this ,不传的话,默认为 undefined 。

4. new 绑定

使用 new 来调用函数, 到底做了什么 ?
function foo(a){
  this.a = a 
}
var bar = new foo(2)

console.log(bar.a) // 2

分析: 使用 new 调用 foo() 时,我们构造一个对象并把它绑定到 foo() 调用的 this 上

new 绑定总结: new 绑定中 this 绑定的就是新生成的对象

总结

后记

你要是看不懂我也没办法了。。。。

文章为个人总结,不足之处还请留言或私信。

转载请注明出处。

以上。

上一篇下一篇

猜你喜欢

热点阅读