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 相关文章推荐
js setattribute批量设置css样式
Nov 26 Javascript
javascript 动态生成css代码的两种方法
Mar 17 Javascript
Vue.Js中的$watch()方法总结
Mar 23 Javascript
详解vue.js之绑定class和style的示例代码
Aug 24 Javascript
深入理解Vuex 模块化(module)
Sep 26 Javascript
Vue组件开发技巧总结
Mar 04 Javascript
解决vue跨域axios异步通信问题
Apr 17 Javascript
vue项目打包后怎样优雅的解决跨域
May 26 Javascript
小程序实现横向滑动日历效果
Oct 21 Javascript
Vue+ElementUI使用vue-pdf实现预览功能
Nov 26 Javascript
javascript开发实现贪吃蛇游戏
Jul 31 Javascript
vue-router重写push方法,解决相同路径跳转报错问题
Aug 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
PHP JS Ip地址及域名格式检测代码
2013/09/27 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
PHP共享内存用法实例分析
2016/02/12 PHP
js的with语句使用方法
2007/09/21 Javascript
json格式化/压缩工具 Chrome插件扩展版
2010/05/25 Javascript
javascript循环变量注册dom事件 之强大的闭包
2010/09/08 Javascript
js判断浏览器是否支持html5
2014/08/17 Javascript
Internet Explorer 11 浏览器介绍:别叫我IE
2014/09/28 Javascript
javascript模拟C#格式化字符串
2015/08/26 Javascript
Vue.js创建Calendar日历效果
2016/11/03 Javascript
原生JS简单实现ajax的方法示例
2016/11/29 Javascript
快速解决brew安装特定版本flow的问题
2018/05/17 Javascript
React 组件间的通信示例
2018/06/14 Javascript
解决vue点击控制单个样式的问题
2018/09/05 Javascript
vue实现的网易云音乐在线播放和下载功能案例
2019/02/18 Javascript
详解vue 不同环境配置不同的打包命令
2019/04/07 Javascript
[53:15]Newbee vs Pain 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python实现获取命令行输出结果的方法
2017/06/10 Python
python tensorflow基于cnn实现手写数字识别
2018/01/01 Python
Python使用numpy模块创建数组操作示例
2018/06/20 Python
python实现将一个数组逆序输出的方法
2018/06/25 Python
python BlockingScheduler定时任务及其他方式的实现
2019/09/19 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
2019/10/24 Python
python 调整图片亮度的示例
2020/12/03 Python
CSS3利用text-shadow属性实现多种效果的文字样式展现方法
2016/08/25 HTML / CSS
深入理解HTML5定时器requestAnimationFrame的使用
2018/12/12 HTML / CSS
太阳镜仓库,售价20美元或更少:Sunglass Warehouse
2016/09/28 全球购物
《小池塘》教学反思
2014/02/28 职场文书
演讲稿格式
2014/04/30 职场文书
家长会标语
2014/06/24 职场文书
2014年林业工作总结
2014/12/05 职场文书
违反工作规定检讨书范文
2014/12/14 职场文书
教代会开幕词
2015/01/28 职场文书
违反纪律检讨书范文
2015/05/07 职场文书
python 自动刷新网页的两种方法
2021/04/20 Python
python_tkinter弹出对话框创建
2022/03/20 Python