当前位置:   article > 正文

vue小记——this(2)

vue小记——this(2)

Vue的方法中使用普通函数作为回调函数,那么在该回调函数中,this将不会指向Vue实例,而是指向全局对象(在浏览器中是window)。

错误 :

  1. export default {
  2. data() {
  3. return {
  4. message: 'Hello Vue!'
  5. };
  6. },
  7. methods: {
  8. someAsyncMethod() {
  9. setTimeout(function() {
  10. // 在这里,`this` 指向全局对象(通常是 window)
  11. console.log(this.message); // undefined,因为 this 不再指向 Vue 实例
  12. }, 1000);
  13. }
  14. }
  15. }

因为 setTimeout 是一个全局函数,当它的回调函数被执行时,它是在全局作用域中运行的,而不是在 Vue 实例的作用域中。因此,除非你显式地绑定 this(如使用 bind 方法),否则 this 将会指向全局对象

为了解决这个问题,通常有两种方法:

使用箭头函数

  1. export default {
  2. data() {
  3. return {
  4. message: 'Hello Vue!'
  5. };
  6. },
  7. methods: {
  8. someMethod() {
  9. setTimeout(() => {
  10. // 在这里,`this` 指向 Vue 实例
  11. this.message = 'Updated message';
  12. }, 1000);
  13. }
  14. }
  15. }

手动绑定 this 

  1. export default {
  2. data() {
  3. return {
  4. message: 'Hello Vue!'
  5. };
  6. },
  7. methods: {
  8. someMethod() {
  9. setTimeout(function() {
  10. // 在这里,`this` 指向 Vue 实例
  11. this.message = 'Updated message';
  12. }.bind(this), 1000);
  13. }
  14. }
  15. }

原生 JavaScript 中,如果需要回调函数中的 this 指向外部对象或闭包中的变量,那么使用箭头函数可能更合适。但如果不需要这样的绑定,或者希望 this 指向调用回调函数时的上下文(如 DOM 元素),那么使用普通函数可能更合适。

  1. // 原生 JavaScript 中的回调函数示例
  2. const element = document.getElementById('myElement');
  3. // 使用普通函数,`this` 指向 element
  4. element.addEventListener('click', function() {
  5. console.log(this); // 输出 element
  6. });
  7. // 使用箭头函数,`this` 指向定义时的上下文(通常是外部对象或全局对象)
  8. const myObject = {
  9. message: 'Hello World!'
  10. };
  11. // 如果我们希望箭头函数内部的 `this` 指向 myObject,那么可以这样做
  12. element.addEventListener('click', () => {
  13. console.log(this.message); // 输出 "Hello World!"
  14. });
  15. // 如果我们希望箭头函数内部的 `this` 指向元素本身(就像普通函数一样),
  16. // 我们需要手动绑定,但箭头函数在这里没有优势
  17. element.addEventListener('click', (() => {
  18. console.log(this); // 输出 element
  19. }).bind(element));
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号