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 保存数组到Cookie的代码
Apr 14 Javascript
一步一步制作jquery插件Tabs实现过程
Jul 06 Javascript
js实现简单的星级选择器提交效果适用于评论等
Oct 18 Javascript
JS实现的模仿QQ头像资料卡显示与隐藏效果
Apr 07 Javascript
VUE元素的隐藏和显示(v-show指令)
Jun 23 Javascript
vue2.0+vue-dplayer实现hls播放的示例
Mar 02 Javascript
js+css实现红包雨效果
Jul 12 Javascript
js实现前面自动补全位数的方法
Oct 10 Javascript
JS实现可用滑块滑动的缓动图代码
Sep 01 Javascript
JavaScript canvas动画实现时钟效果
Feb 10 Javascript
Vue多选列表组件深入详解
Mar 02 Vue.js
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
Apr 13 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(2)――PHP类型
2010/02/15 PHP
php file_put_contents()功能函数(集成了fopen、fwrite、fclose)
2011/05/24 PHP
PHP实现的简单mock json脚本分享
2015/02/10 PHP
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
一个挺有意思的Javascript小问题说明
2011/09/26 Javascript
js字符串转成JSON
2013/11/07 Javascript
JS实现判断碰撞的方法
2015/02/11 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
2015/03/26 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
2015/05/07 Javascript
完善的jquery处理机制
2016/02/21 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
javascript中json基础知识详解
2017/01/19 Javascript
PHP实现记录代码运行时间封装类实例教程
2017/05/08 Javascript
bootstrap可编辑下拉框jquery.editable-select
2017/10/12 jQuery
jfinal与bootstrap的登出实战详解
2017/11/27 Javascript
详解关于webpack多入口热加载很慢的原因
2019/04/24 Javascript
教你如何用Node实现API的转发(某音乐)
2019/09/20 Javascript
vue动态禁用控件绑定disable的例子
2019/10/28 Javascript
JavaScript如何判断对象有某属性
2020/07/03 Javascript
Vue+Java 通过websocket实现服务器与客户端双向通信操作
2020/09/22 Javascript
[16:56]教你分分钟做大人:司夜刺客
2014/10/30 DOTA
Python装饰器使用示例及实际应用例子
2015/03/06 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
2018/02/18 Python
深入浅析python3中的unicode和bytes问题
2019/07/03 Python
Python Selenium 之数据驱动测试的实现
2019/08/01 Python
Python Numpy,mask图像的生成详解
2020/02/19 Python
Python列表去重复项的N种方法(实例代码)
2020/05/12 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
护理自荐信范文
2013/10/05 职场文书
大学生入党自我鉴定
2013/10/31 职场文书
心理学专业毕业生推荐信范文
2013/11/21 职场文书
餐厅感恩节活动策划方案
2014/10/11 职场文书
领导班子群众路线与四风问题对照检查材料思想汇报
2014/10/11 职场文书
酒店优秀员工推荐信
2015/03/24 职场文书
MongoDB数据库的安装步骤
2021/06/18 MongoDB