翼度科技»论坛 编程开发 JavaScript 查看内容

JavaScript 中 this 关键字的作用和如何改变其上下文

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
一、this 关键字的作用
JavaScript 中的 this 关键字引用了所在函数正在被调用时的对象。在不同的上下文中,this 的指向会发生变化。
在全局上下文中,this 指向全局对象(在浏览器中是 window 对象,在 Node.js 中是 global 对象)。


在函数中,this 指向调用该函数的对象。如果该函数是通过对象的方法调用的,那么 this 指向该对象;如果是通过函数调用的,那么 this 指向全局对象。
在箭头函数中,this 继承自父级作用域中的 this。
在类的构造函数中,使用 new 关键字调用类时,this 指向新创建的对象。
例如:
  1. class MyClass {
  2.   constructor() {
  3.     this.value = 42;
  4.   }
  5. }
  6. let obj = new MyClass();
  7. console.log(obj.value); // 42
复制代码
类的实例方法中的 this 默认指向实例本身,类方法中的 this 默认指向类本身
例如:
  1. class MyClass {
  2.   value = 42;
  3.   printValue() {
  4.     console.log(this.value);
  5.   }
  6.   static printValue() {
  7.     console.log(this.value);
  8.   }
  9. }
  10. let obj = new MyClass();
  11. obj.printValue(); // 42
  12. MyClass.printValue(); // undefined
复制代码
使用 Object.create 方法创建对象
使用 Object.create 方法创建是一种特殊的调用方式。在这种情况下,如果在对象的原型链上调用函数,则 this 指向该对象。
例如:
  1. let baseObject = { value: 42 };
  2. let obj = Object.create(baseObject);
  3. function printValue() {
  4.   console.log(this.value);
  5. }
  6. printValue.call(obj); // 42
复制代码
这种情况下, obj 的原型链上有 value 属性,所以调用 printValue() 方法时, this 指向 obj 对象。
在类中使用箭头函数
类中使用箭头函数定义的方法中的 this 指向是绑定的,它指向的是类的实例,而不是类本身。
例如:
  1. class MyClass {
  2.   value = 42;
  3.   printValue = () => {
  4.     console.log(this.value);
  5.   }
  6. }
  7. let obj = new MyClass();
  8. obj.printValue(); // 42
复制代码
箭头函数的 this 是定义时的 this,而不是调用时的 this。因此,在类中使用箭头函数可以避免在方法中使用 bind 来绑定 this。
在调用构造函数时,未使用 new 关键字
在这种情况下,this 指向全局对象。这种情况下不会创建新的对象,而是改变了全局对象的状态。
例如:
  1. class MyClass {
  2.   constructor() {
  3.     this.value = 42;
  4.   }
  5. }
  6. let obj = MyClass(); // without new keyword
  7. console.log(obj); // undefined
  8. console.log(value); // 42
复制代码
因此,在使用构造函数创建对象时,需要确保使用 new 关键字来调用构造函数,否则可能会导致意外的结果。
在使用构造函数时特别需要注意使用 new 关键字来调用。
在对象的方法中使用箭头函数会导致 this 指向问题
例如:
  1. let obj = {
  2.   value: 42,
  3.   printValue: () => {
  4.     console.log(this.value);
  5.   }
  6. };
  7. obj.printValue(); // undefined
复制代码
这种情况下,在 obj 对象的 printValue 方法中使用了箭头函数,而箭头函数的 this 指向是定义时的 this,而不是调用时的 this。在这种情况下,因为箭头函数的 this 指向是定义时的 this,所以 this.value 指向的是 undefined,而不是 obj 对象中的 value。
解决这种问题可以使用箭头函数的父级作用域中的 this,或者使用普通函数来解决。
例如:
  1. let obj = {
  2.   value: 42,
  3.   printValue: function(){
  4.     console.log(this.value);
  5.   }
  6. };
  7. obj.printValue(); // 42
复制代码
或者
  1. let obj = {
  2.   value: 42,
  3.   printValue: () => {
  4.     console.log(obj.value);
  5.   }
  6. };
  7. obj.printValue(); // 42
复制代码
在对象的方法中使用箭头函数会导致 this 指向问题,需要特别注意。可以使用箭头函数的父级作用域中的 this 或者普通函数来解决。
总之,JavaScript 中的 this 关键字指向的上下文取决于函数的调用方式,需要根据不同的场景来选择合适的方式来改变 this 的指向。
二、如何改变 this 上下文
可以通过 call, apply, bind 方法来改变 this 的上下文。
call 和 apply 方法允许您将函数的 this 指向指定的对象,并立即执行该函数。
call 方法的语法格式如下:
  1. functionName.call(thisArg, arg1, arg2, ...);
复制代码
apply 方法的语法格式如下:
  1. functionName.apply(thisArg, [arg1, arg2, ...]);
复制代码
bind 方法允许您将函数的 this 指向指定的对象,但不立即执行函数,而是返回一个新函数,可以在将来执行。
  1. let newFunc = functionName.bind(thisArg, arg1, arg2, ...);
复制代码
例如:
  1. let obj = {value: 42};
  2. function printValue() {
  3.   console.log(this.value);
  4. }
  5. printValue.call(obj); // 42
  6. printValue.apply(obj); // 42
  7. let boundFunc = printValue.bind(obj);
  8. boundFunc(); // 42
复制代码
总之,通过使用 call, apply, bind 方法,可以改变函数中的 this 指向,从而在不同的上下文中使用同一个函数。

来源:https://www.cnblogs.com/yuzhihui/p/17063783.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具