乐趣区

关于javascript:JavaScript中的this

this 是什么?

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

不同状况下的 this

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

在全局作用域中创立的一般函数,this 指向全局对象即 window

2、作为对象办法创立的函数

函数作为对象的属性而创立,调用时 this 指向这个对象

3、构造函数

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

new 关键字做了什么工作?

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

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

4、箭头函数

ES6 箭头函数没有本人的 this,创立时主动继承上一层的 this。如果箭头函数有外层函数,那么它的 this 指向外层函数的 this;如果没有外层函数,那么它的 this 就是 window

5、call/apply/bind

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

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

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

call


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

apply


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

bind


实现 bind 的思路略微简单一些,关键在于 bind 返回的是一个函数。这就要思考以下几个问题:

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