[关闭]
@Dale-Lin 2022-03-08T14:54:55.000000Z 字数 1401 阅读 403

JS this

JavaScript


在一个函数(在非严格模式)被调用时,this 作为默认的参数传递。
this 在 JavaScript 中的值取决于函数调用的模式。(运行时绑定)


方法调用模式

一个函数作为一个对象的属性时,称为一个方法。
如果调用表达式包含一个.,则是作为某对象的属性调用的方法。
作为方法调用时,this 绑定在该对象上。

此时,方法中使用 this 可以访问自己所属的对象。

特例

  1. const a = {
  2. name: 'a',
  3. sayThis: () => {
  4. console.log(this) // 声明语句所处的 this 是 Window
  5. }
  6. }
  7. const b = {
  8. name: 'b',
  9. sayThis() {
  10. console.log(this)
  11. }
  12. }
  13. a.sayThis() // Window
  14. b.sayThis() // b
  15. b.sayThis = a.sayThis
  16. b.sayThis() // Window

函数调用模式

当一个函数不作为一个对象的属性时,则作为一个函数调用。
非严格模式:函数调用时的 this 绑定到全局对象(window/globalThis)。
严格模式:this 为 undefined。

如果在闭包中需要访问外部函数的上下文,必须将外部函数的 this 保存在变量中,再在闭包中用该变量替换。否则闭包中直接使用的 this 将指向全局变量:

  1. myObj.double = function(){
  2. var that = this;
  3. var helper = function(){
  4. that.value = add(that.value, that.value);
  5. }
  6. helper(); //函数形式调用
  7. }

特例

  1. class Animal {
  2. sayThis() {
  3. console.log(this)
  4. }
  5. static sayDees() {
  6. console.log(this)
  7. }
  8. }
  9. Animal.sayDees() // class Animal
  10. const a = new Animal()
  11. a.sayThis() // Animal a
  12. // 类实例的方法相当于启用了严格模式
  13. let copy = a.sayThis
  14. copy() // undefined
  15. copy = Animal.sayDees
  16. copy() // undefined

构造器调用模式

使用 new 操作符调用函数时,会创建一个连接到该函数的 prototype 对象的新对象。
此时新对象内的 this 绑定在这个新对象上。

  1. var Quo = function(str){
  2. this.status = str;
  3. };
  4. Quo.prototype.get_status = function(){
  5. return this.status;
  6. };
  7. var myQuo = new Quo("confused");
  8. myQuo.get_status(); //"confused"

Apply 调用模式

使用函数的 apply()call() 调用的时候,this 会绑定在这两个方法的第一个参数上。

call() 方法接受单独的参数;apply() 方法接受一个参数数组。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注