zoukankan      html  css  js  c++  java
  • vue中的this指向问题

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script src="http://libs.baidu.com/jquery/2.0.0/jquery.js"></script>
        <script src="https://unpkg.com/vue@2.5.9/dist/vue.js"></script>
    </head>
    <div id="app" style=" 100%;height: auto;font-size:20px;">
        <p id="id1"></p>
        <p id="id2"></p>
    </div>
    <script type="text/javascript">
        var message = "Hello!";
        var app = new Vue({
            el:"#app",
            data:{
                message: "你好!"
            },
            created: function() {
              this.showMessage1();    //this 1
              this.showMessage2();   //this 2
            },
            methods:{
                showMessage1:function(){
                    setTimeout(function() {
                       document.getElementById("id1").innerText = this.message;  //this 3
                    }, 10)
                },
                showMessage2:function() {
                    setTimeout(() => {
                       document.getElementById("id2").innerText = this.message;  //this 4
                    }, 10)
                }
            }
        });
    </script>
    </html>

    第一个输出英文"Hello!”,第二个输出中文“你好!”。这说明了showMessage1()里的this指的是window,而showMessage2()里的this指的是vue实例。
    ※  对于普通函数(包括匿名函数),this指的是直接的调用者,在非严格模式下,如果没有直接调用者,this指的是window。showMessage1()里setTimeout使用了匿名函数,this指向
    window。
    ※  箭头函数是没有自己的this,在它内部使用的this是由它定义的宿主对象决定。showMessage2()里定义的箭头函数宿主对象为vue实例,所以它里面使用的this指向vue实例。
    注:
    【普通函数的this】
             普通函数的this是由动态作用域决定,它总指向于它的直接调用者。具体可以分为以下四项:
    this总是指向它的直接调用者, 例如 obj.func() ,那么func()里的this指的是obj。
    在默认情况(非严格模式,未使用 'use strict'),如果函数没有直接调用者,this为window
    在严格模式下,如果函数没有直接调者,this为undefined
    使用call,apply,bind绑定的,this指的是绑定的对象
    绑定vue实例到this的方法
    为了避免this指向出现歧义,有两种方法绑定this。
    使用bind
    showMessage1()可以改为:
    showMessage1:function(){
        setTimeout(function() {
           document.getElementById("id1").innerText = this.message;  //this 3
        }.bind(this), 10)
    }
     
    对setTimeout()里的匿名函数使用bind()绑定到vue实例的this。这样在匿名函数内的this也为vue实例。
    把vue实例的this赋值给另一个变量再使用
    showMessage1()也可以改为
    showMessage1:function(){
        var self = this;
        setTimeout(function() {
           document.getElementById("id1").innerText = self.message;  //改为self
        }.bind(this), 10
    }

  • 相关阅读:
    基础实验7-2.2 插入排序还是堆排序 (25分)
    进阶实验6-3.1 红色警报 (25分)--并查集
    基础实验3-2.2 单链表分段逆转 (25分)--单链表
    基础实验6-2.2 汉密尔顿回路 (25分)--邻接矩阵
    案例6-1.3 哥尼斯堡的“七桥问题” (25分)--dfs图连通+度判断
    基础实验8-1.1 单身狗 (25分)
    基础实验7-2.3 德才论 (25分)--排序
    基础实验7-2.4 PAT排名汇总 (25分)--结构体排序(快排)
    进阶实验4-3.4 笛卡尔树 (25分)--二叉排序树+堆排序
    基础实验4-2.7 修理牧场 (25分)-堆+哈夫曼树
  • 原文地址:https://www.cnblogs.com/junjun-001/p/13181878.html
Copyright © 2011-2022 走看看