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 json 新手入门文档
Dec 03 Javascript
js作用域及作用域链概念理解及使用
Apr 15 Javascript
详解JavaScript中setSeconds()方法的使用
Jun 11 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
Sep 18 Javascript
AngularJS中如何使用echart插件示例详解
Oct 26 Javascript
jQuery仿IOS弹出框插件
Feb 18 Javascript
使用OPENLAYERS3实现点选的方法
Sep 24 Javascript
深入解析Vue 组件命名那些事
Jul 18 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
Jul 12 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
Feb 21 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
Feb 09 Javascript
javascript实现画板功能
Apr 12 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批量删除数据
2007/01/18 PHP
快速开发一个PHP扩展图文教程
2008/12/12 PHP
php函数重载的替代方法--伪重载详解
2015/05/08 PHP
php给图片加文字水印
2015/07/31 PHP
深入剖析浏览器退出之后php还会继续执行么
2016/05/17 PHP
JavaScript 快捷键设置实现代码
2009/03/13 Javascript
Chosen 基于jquery的选择框插件使用方法
2012/05/30 Javascript
JavaScript 模式之工厂模式(Factory)应用介绍
2012/11/15 Javascript
js模仿jquery的写法示例代码
2013/06/16 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
jQuery中:only-child选择器用法实例
2015/01/03 Javascript
浅谈javascript中return语句
2015/07/15 Javascript
JS中使用正则表达式g模式和非g模式的区别
2017/04/01 Javascript
Angular中ng-options下拉数据默认值的设定方法
2017/06/21 Javascript
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
webstorm中配置nodejs环境及npm的实例
2018/05/15 NodeJs
使用Vue自定义指令实现Select组件
2018/05/24 Javascript
Angular PWA使用的Demo示例
2019/01/31 Javascript
浅谈js闭包理解
2019/04/01 Javascript
vue自定义指令directive的使用方法
2019/04/07 Javascript
Javascript Web Worker使用过程解析
2020/03/16 Javascript
基于JavaScript实现留言板功能
2020/03/16 Javascript
Vue中正确使用Element-UI组件的方法实例
2020/10/13 Javascript
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
2018/01/05 Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
2018/02/23 Python
python多线程+代理池爬取天天基金网、股票数据过程解析
2019/08/13 Python
Python搭建HTTP服务过程图解
2019/12/14 Python
英国最大的电子零件及配件零售商:Partmaster
2017/04/24 全球购物
您的健身减肥和健康饮食专家:vitafy
2017/06/06 全球购物
Skyscanner加拿大:全球旅行搜索平台
2018/11/19 全球购物
后备干部考察材料
2014/02/12 职场文书
校园活动策划方案
2014/06/13 职场文书
代理人委托书
2014/08/01 职场文书
推普周活动总结
2014/08/28 职场文书
高中数学课堂教学反思
2016/02/18 职场文书
python爬虫--selenium模块
2021/03/31 Python