this在vue和小程序中的使用详解


Posted in Javascript onJanuary 28, 2019

匿名函数下的this

方便本地demo,没有使用webpack

引入两个文件,vue和axios

axios返回一个promise对象,我们通过axios进行ajax请求

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
 <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<body>
  <div id="app">
    {{ message }}
  </div>
</body>

看下js部分

var message = '我是全局message!';
var app = new Vue({
 el: '#app',
 data() {
  return {
   message: '我是vue下的message!'
  }
 },
 created() {
  this.getData()
 },
 methods: {
  getData() {
   axios.get('https://easy-mock.com/mock/5b0525349ae34e7a89352191/example/promise1')
    .then(function () {
     console.log(this.message);//=>我是全局message!
    })
  }
 }
})

不必关心axios请求的接口返回的数据

那么在axios下,输出的是=>我是全局message!,为什么呢?我们是想输出=>”我是vue下的message!”

在这里有那么一些人就蒙了,为什么axios下会这样呢?

axios有话说:

this在vue和小程序中的使用详解

出现这种情况,不是axios的锅,

不信你往下看

//其他代码省略
 getData() {
  setTimeout(function () {
   console.log(this.message);//=>我是全局message!
  }, 1000);
 }
}

我们将getData方法下的axios请求换掉,用一个定时器替代,其他部分保持不变

输出依然是=>我是全局message!

为什么?

因为

匿名函数下this指向window

至于原因, 这里解释的很清楚https://www.zhihu.com/question/21958425

你只需要记住一点,默认情况下,匿名函数this指向window

如何处理匿名函数下this指向的问题呢?

通过bind来处理

结合之前所学,我们可以同bind来进行处理

//部分代码省略
created() {
  this.getData()
},
  methods: {
    getData() {
      setTimeout(function () {
        console.log(this.message);//=>我是vue下的message!
      }.bind(this), 1000);
    }
  }

通过bind可以改变this的指向,这是一中解决方式

还有一种比较常用

this赋值暂存

created() {
 this.getData()
},
methods: {
 getData() {
  const that = this
  setTimeout(function () {
   console.log(that.message);//=>我是vue下的message!
  }, 1000);
 }
}

在匿名函数之前,我们先将this赋值给that,在匿名函数中使用that来替代原来的this,同样可以实现我们所希望的效果

如果你的项目支持ES6标准,那么

箭头函数是你最佳选择

getData() {
 axios.get('https://easy-mock.com/mock/5b0525349ae34e7a89352191/example/promise1')
  .then(() => {
   console.log(this.message);
  })
}

我们在之前的文章中总结过一个结论

this的指向是在函数执行的时候定义的,而不是在函数创建时定义的,this指向的是最后调用它的对象

我们接下来本篇文章的另一个知识点

箭头函数中的this

看一个栗子

var heroName = '黄蓉';
var heroObj = {
 heroName: '郭靖',
 callName: function () {
  console.log(this.heroName)//=>郭靖
 }
}
heroObj.callName();

this指向最后调用它的对象,所以输出=>郭靖

再看下箭头函数的栗子

var heroName = '黄蓉';
var heroObj = {
 heroName: '郭靖',
 callName: () => {
  console.log(this.heroName)//=>黄蓉
 }
}
heroObj.callName();

对这个输出结果感到意外吗?

不管懵没懵,我们再看一个栗子

var heroName = '黄蓉';
function getHeroName() {
 this.heroName = '郭靖'
 const foo = () => {
  console.log(this.heroName)//=>郭靖
 }
 foo();
}
getHeroName();

放在一起做一下比较:

普通函数:this的指向是在函数 执行 的时候绑定的,而不是在函数 创建 时绑定的

箭头函数:this的指向是在函数 创建 的时候绑定的,而不是在函数 执行 时绑定的。

不管在什么情况下,箭头函数的this跟外层function的this一致,外层function的this指向谁,箭头函数的this就指向谁,如果外层不是function则指向window。

ES6中定义的时候绑定的this是继承的父执行上下文里面的this

小程序中的this

如果项目中的小程序也支持ES6标准,无疑,使用箭头函数是一个不错的选择

//省略。。。
 getLocation() {
  wx.chooseLocation({
   success: res => {
    if (res.address && res.name) {
     this.setData({
      shopAddress: `${res.address}(${res.name})`
     })
    } else if (res.address) {
     this.setData({
      shopAddress: `${res.address}`
     })
    }
   }
  })
 }

很多场景就不需要缓存中转this

var that = this//使用箭头函数替代此方案

合理的使用this会使我们事半功倍

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 放大镜 v1.0 基于Yui2 实现的放大镜效果
Mar 08 Javascript
Js event事件在IE、FF兼容性问题
Jan 01 Javascript
js 定时器setTimeout无法调用局部变量的解决办法
Nov 28 Javascript
jquery简单实现幻灯片的方法
Aug 03 Javascript
JavaScript异步上传图片文件的实例代码
Jul 04 Javascript
js实现前端图片上传即时预览功能
Aug 02 Javascript
一个有意思的鼠标点击文字特效jquery代码
Sep 23 jQuery
开发Vue树形组件的示例代码
Dec 21 Javascript
JS验证输入的是否是数字及保留几位小数问题
May 09 Javascript
javascript实现文本框标签验证的实例代码
Oct 14 Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
Nov 29 Javascript
关于ES6尾调用优化的使用
Sep 11 Javascript
Vue加载json文件的方法简单示例
Jan 28 #Javascript
Vue项目安装插件并保存
Jan 28 #Javascript
vue 左滑删除功能的示例代码
Jan 28 #Javascript
详解Next.js页面渲染的优化方案
Jan 27 #Javascript
在Vue项目中取消ESLint代码检测的步骤讲解
Jan 27 #Javascript
在Vue项目中引入JQuery-ui插件的讲解
Jan 27 #jQuery
在vue项目中使用Jquery-contextmenu插件的步骤讲解
Jan 27 #jQuery
You might like
随机广告显示(PHP函数)
2006/10/09 PHP
PHP实现用户认证及管理完全源码
2007/03/11 PHP
基于Linux调试工具strace与gdb的常用命令总结
2013/06/03 PHP
解析PHP工厂模式的好处
2013/06/18 PHP
php读取本地文件常用函数(fopen与file_get_contents)
2013/09/09 PHP
php并发加锁示例
2016/10/17 PHP
JAVASCRIPT下判断IE与FF的比较简单的方式
2008/10/17 Javascript
关于js遍历表格的实例
2013/07/10 Javascript
js使用数组判断提交数据是否存在相同数据
2013/11/27 Javascript
解析页面加载与js函数的执行 onload or ready
2013/12/12 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
JavaScript中的toLocaleDateString()方法使用简介
2015/06/12 Javascript
微信小程序去哪里找 小程序到底如何使用(附小程序名单)
2017/01/09 Javascript
JavaScript闭包的简单应用
2017/09/01 Javascript
微信小程序基于本地缓存实现点赞功能的方法
2017/12/18 Javascript
JS文件中加载jquery.js的实例代码
2018/05/05 jQuery
vue展示dicom文件医疗系统的实现代码
2018/08/27 Javascript
详解webpack2异步加载套路
2018/09/14 Javascript
vue文件运行的方法教学
2019/02/12 Javascript
element-ui 弹窗组件封装的步骤
2021/01/22 Javascript
python字典基本操作实例分析
2015/07/11 Python
python如何获取服务器硬件信息
2017/05/11 Python
Python传递参数的多种方式(小结)
2019/09/18 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
2020/02/10 Python
Python while true实现爬虫定时任务
2020/06/08 Python
Python2及Python3如何实现兼容切换
2020/09/01 Python
python类共享变量操作
2020/09/03 Python
The North Face北面荷兰官网:美国著名户外品牌
2019/10/16 全球购物
珍珠奶茶店创业计划书
2014/01/11 职场文书
勤奋学习演讲稿
2014/05/10 职场文书
项目申请汇报材料
2014/08/16 职场文书
心得体会的写法
2014/09/05 职场文书
2014年语文教研组工作总结
2014/12/06 职场文书
上帝为你开了一扇窗之Tkinter常用函数详解
2021/06/02 Python
Python类方法总结讲解
2021/07/26 Python
《勇者辞职不干了》上卷BD发售宣传CM公开
2022/04/08 日漫