var self = this:为什么它在处理回调函数中的 this 丢失问题如此有效?

在这里插入图片描述

🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠 牛客高级专题作者、打造专栏《前端面试必备》《2024面试高频手撕题》
🍚 蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》《带你从入门到实战全面掌握 uni-app》
💬 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站


在 JavaScript 中,使用 var self = this 这种模式常见于为了在回调函数中保持对外部上下文(即外部函数或方法)中 this 的引用。让我们逐步了解其中的原因及用法。

1. this 的问题

在 JavaScript 中, this 的值是动态确定的,具体取决于函数的调用方式。特别是当你在回调函数中使用 this 时,它可能不会指向你希望的对象。这就导致了一些问题,比如在事件处理、异步操作等场景中。

示例:this 的指向变化

function Person(name) {
  this.name = name;

  this.sayHello = function() {
    console.log(`Hello, my name is ${this.name}`);
  };

  setTimeout(function() {
    this.sayHello(); //这里的 this 指向全局对象,undefined 在严格模式下
  }, 1000);
}

const person = new Person('Alice');
// person.sayHello() 会输出: Hello, my name is Alice
// 但是 setTimeout 中的 this.sayHello() 是一个错误的调用

在这里插入图片描述

在上面的例子中,setTimeout 的回调函数中的 this 并不是指向 Person 对象。这会导致 this.name 不指向 Alice

2. 使用 var self = this

为了在回调函数中保留外部上下文的 this,常用的解决方案是将 this 赋值给一个变量,例如 selfthat

示例代码

function Person(name) {
  this.name = name;

  this.sayHello = function() {
    console.log(`Hello, my name is ${this.name}`);
  };

  var self = this; // 保存外部函数中的 this

  setTimeout(function() {
    self.sayHello(); // 现在 self 是指向 Person 对象的
  }, 1000);
}

const person = new Person('Alice');
// 输出: Hello, my name is Alice (延迟 1 秒)

在这里插入图片描述

在这个例子中,使用 var self = thisthis 的引用保存在 self 中,然后在 setTimeout 的回调中使用 self 引用。

3. 箭头函数的替代方案

在箭头函数中,this 会从外部上下文中捕获。因此,在现代 JavaScript 中,推荐使用箭头函数来避免使用 var self = this 的模式。

示例代码

function Person(name) {
  this.name = name;

  this.sayHello = function() {
    console.log(`Hello, my name is ${this.name}`);
  };

  setTimeout(() => {
    this.sayHello(); // 这里的 this 指向 Person 对象
  }, 1000);
}

const person = new Person('Alice');
// 输出: Hello, my name is Alice (延迟 1 秒)

在这里插入图片描述

在这个例子中,使用箭头函数后,this 会正确地指向 Person 对象,而不需要额外保存。

4. 总结

  • 使用 var self = this 是一个历史遗留问题,用于保持外部上下文中的 this 在回调函数中的可用性。
  • 在现代 JavaScript 中,可以使用箭头函数来自动捕获外部上下文的 this,从而减少这种模式的使用。
  • 理解 this 的指向对于编写清晰和可预测的代码至关重要。使用 var self = this 和箭头函数都是解决 this 指向问题的有效方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿珊和她的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值