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 相关文章推荐
初识JQuery 实例一(first)
Mar 16 Javascript
JavaScript DOM操作表格及样式
Apr 13 Javascript
简述Jquery与DOM对象
Jul 10 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
Jan 05 Javascript
在localStorage中存储对象数组并读取的方法
Sep 24 Javascript
微信小程序 实现拖拽事件监听实例详解
Nov 16 Javascript
jQuery居中元素scrollleft计算方法示例
Jan 16 Javascript
Angular 输入框实现自定义验证功能
Feb 19 Javascript
Vue 前端实现登陆拦截及axios 拦截器的使用
Jul 17 Javascript
JavaScript实现京东放大镜效果
Dec 03 Javascript
JS实现省市县三级下拉联动
Apr 10 Javascript
Three.js实现雪糕地球的使用示例详解
Jul 07 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
54个提高PHP程序运行效率的方法
2015/07/19 PHP
thinkphp项目如何自定义微信分享描述内容
2017/02/20 PHP
php简单随机字符串生成方法示例
2017/04/19 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
滚动经典最新话题[prototype框架]下编写
2006/10/03 Javascript
javascript 三种编解码方式
2010/02/01 Javascript
firefox下frameset取不到值的解决方法
2010/09/06 Javascript
JavaScript自定义日期格式化函数详细解析
2014/01/14 Javascript
自定义刻度jQuery进度条及插件
2015/09/02 Javascript
深入理解js中this的用法
2016/05/28 Javascript
node.js cookie-parser 中间件介绍
2016/06/06 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
2016/06/07 Javascript
springMVC结合AjaxForm上传文件
2016/07/12 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
2016/09/01 Javascript
JS禁止查看网页源代码的实现方法
2016/10/12 Javascript
深入理解选择框脚本[推荐]
2016/12/13 Javascript
简单实现jQuery级联菜单
2017/01/09 Javascript
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
EasyUI实现下拉框多选功能
2017/11/07 Javascript
在vue.js中使用JSZip实现在前端解压文件的方法
2018/09/05 Javascript
javascript自定义日期比较函数用法示例
2019/07/22 Javascript
jquery 遍历hash操作示例【基于ajax交互】
2019/10/12 jQuery
微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
2020/04/09 Javascript
ES6函数实现排它两种写法解析
2020/05/13 Javascript
js和jquery判断数据类型的4种方法总结
2020/08/28 jQuery
numpy.std() 计算矩阵标准差的方法
2018/07/11 Python
Python常见数据结构之栈与队列用法示例
2019/01/14 Python
Python实现对adb命令封装
2020/03/06 Python
Django中Q查询及Q()对象 F查询及F()对象用法
2020/07/09 Python
金士达面试非笔试
2012/03/14 面试题
什么样的创业计划书可行性高?
2014/02/01 职场文书
音乐教师求职信
2014/06/28 职场文书
2014小学生国庆65周年演讲稿
2014/09/21 职场文书
清洁员岗位职责
2015/02/15 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
vue整合百度地图显示指定地点信息
2022/04/06 Vue.js