this是什么?

this是JavaScript中的一个关键字,每个函数在创建时,都会隐式地创建一个对象,指向函数的上下文,这个对象就是this。

不同情况下的this

1、全局作用域中创建的函数

在全局作用域中创建的普通函数,this指向全局对象即window
全局函数this.png

2、作为对象方法创建的函数

函数作为对象的属性而创建,调用时this指向这个对象
对象方法的this.png

3、构造函数

构造函数中的this,指向它所创建的实例对象
构造函数this.png

new关键字做了什么工作?

使用new关键字构造对象时,new做了以下几个内容

  • 创建一个新对象
  • 把构造函数的原型对象prototype赋值给新对象的_proto_属性,实现实例对象对构造函数的继承
  • 把构造函数的this赋值给新对象的this
  • 以上几步都是隐式的操作,接下来执行构造函数中的语句,给新对象添加属性
  • 返回新对象,如果没有创建新对象,则自动返回构造函数的this

4、箭头函数

ES6箭头函数没有自己的this,创建时自动继承上一层的this。如果箭头函数有外层函数,那么它的this指向外层函数的this;如果没有外层函数,那么它的this就是window
箭头函数的this.png

5、call/apply/bind

函数的call、apply和bind方法都能为函数指定一个对象作为this,这三个方法的区别在于

  • 调用bind方法会返回一个新的,指定过this的函数,但函数不会立即执行;call/apply方法会给函数指定新的this后立即执行
  • call方法中,实参可以传递多个;apply方法的实参放在数组里统一传递

面试时偶尔会碰到手撕bind/call/apply方法的题目,这时候该怎么办呢

call

call.png
实现call的思路在于,给传进来的对象添加一个方法,即调用call的那个函数,并且调用该方法,返回其执行结果

apply

apply.png
实现apply的思路和call基本一致,不同点是把实参放入一个数组中传递

bind

bind.png
实现bind的思路稍微复杂一些,关键在于bind返回的是一个函数。这就要考虑以下几个问题:

  • this的绑定问题
  • 返回值是一个函数,那么对这个函数进行new操作的话应该怎么办
  • 传入bind的实参要与返回函数的实参进行合并

菜菜的电冰箱
15 声望0 粉丝

程序媛