• 使用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了

    在这里插入图片描述

  • 相关阅读:
    自动化运维:Ansible脚本之playbook剧本
    linux内核中watchdog、lockup、stall、hung等检测
    linux debian8.2系统安装mysql
    前端必会面试题总结
    [LeetCode周赛复盘] 第 361 场周赛20230906
    git基础
    rac环境rman备份
    A-Level经济真题每期一练(23)
    趣解设计模式之《庞大的组织架构带来的烦恼》
    CopyOnWriteArrayList解析
  • 原文地址:https://blog.csdn.net/qq_45634989/article/details/126405001