• 使用this调用vue中定义的,data中数据或methods中的方法,报错undefined的原因及解决办法


    问题描述

    使用this调用vue中定义的data时,报错,这个变量undefined

    <template>
        <div>
            <button @click="clicks()">测试按钮</button>
        </div>
    </template>
    
    <script>
    export default {
        data() {
            return {
                cacheList: [1, 2, 3, 4, 5],
                t: 0//在data中定义了变量t
            }
        },
        methods: {
            clicks() {
                this.cacheList.forEach(function (item, index, arr) {
                    console.log(this)//undefined
                    this.t = item//t未被定义,报错
                });
            }
        }
    }
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    报错:
    在这里插入图片描述

    解决办法

    既然知道是this的指向发生了错误,那么,在this发生错误之前,将this使用一个变量存储起来就行
    在这里插入图片描述
    在这里插入图片描述

    原因

    参考文章 彻底理解js中this的指向
    网上基本的观点是:

    this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁,实际上this的最终指向的是那个调用它的对象

    事实上,在大部分的情况下,这种说法是成立的,但是也不绝对,如下:

    var o = {
        a:10,
        b:{
            a:12,
            fn:function(){
                console.log(this.a); //12
            }
        }
    }
    o.b.fn();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    这里最终调用fn()方法的是o对象,可是输出中的是b对象的值
    应该是这样:

    1. 如果一个函数中有this,但是它没有被上一级的对象所调用,那么this指向的就是window,这里需要说明的是在js的严格版中this指向的不是window(而是undefined),但是我们这里不探讨严格版的问题,你想了解可以自行上网查找。
    2. 如果一个函数中有this,这个函数有被上一级的对象所调用,那么this指向的就是上一级的对象。
    3. 如果一个函数中有this,这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象
    4. this永远指向的是最后调用它的对象,也就是看它执行的时候是谁调用的

    还有一个需要注意的点:

    var o = {
        a:10,
        b:{
            a:12,
            fn:function(){
                console.log(this.a); //undefined
                console.log(this); //window
            }
        }
    }
    var j = o.b.fn;
    j();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    原因:this永远指向的是最后调用它的对象,也就是看它执行的时候是谁调用的

    在我出现的问题中,我没有使用严格模式,但是出现this是undefined的情况呢?参考文章 : vue中的this指向

    在JS的框架下,vue中this的指向有以下规则
    1、 data中的this指向window 所有的生命周期函数中的this都指向vue实例对象
    2、vue的v-on指令中可以接收JS语句,其中的this是window(vue组件中的v-on指令除外)
    3、 computed中的this指向vue实例对象
    methods中的this有以下几种情况
    1、普通函数的this指向vue实例对象
    2、箭头函数没有自己的this,因此this指向其宿主对象的this(注意宿主对象是函数对象(它被调用后this的指向要进行具体分析),简单对象没有this
    3、普通函数形式的回调函数的this是window,箭头函数形式的回调函数的this遵循箭头函数的原则(大多数情况下是vue实例对象)

    由于我在foresch中使用的是匿名函数,匿名函数属于简单函数(简单函数不包括箭头函数),简单函数对象是没有this的,所以上述报错undefined

    其实我出现的报错还有一个解决办法,就是将匿名函数变成箭头函数(原因:箭头函数没有自己的this,因此this指向其宿主对象的this)
    在这里插入图片描述
    这样,this就会指向他的上一级,也就是vue了

    在这里插入图片描述

  • 相关阅读:
    《从零开始的Java世界》04面向对象(高级)
    “低代码”在企业数字化转型中扮演着什么角色?
    【python】Python 中使用 Matplotlib 绘制数据可视化图表
    黑白简约个人网页制作 大学生个人网页设计模板 学生个人博客网页成品 简单个人网站作品下载 静态HTML CSS个人网页作业源代码
    想做动态规划入门微课视频 思路是什么该如何实现
    模仿抖音直播商城带货打赏功能做一个app系统
    java民宿运营管理网站计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    基于SSH开发网上机票销售系统
    leetcode - 360周赛
    ROS2自学笔记:通信接口
  • 原文地址:https://blog.csdn.net/qq_45634989/article/details/126405001