this在vue和小程序中的使用詳解
匿名函數(shù)下的this
方便本地demo,沒有使用webpack
引入兩個(gè)文件,vue和axios
axios返回一個(gè)promise對(duì)象,我們通過axios進(jìn)行ajax請(qǐng)求
<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!
})
}
}
})
不必關(guān)心axios請(qǐng)求的接口返回的數(shù)據(jù)
那么在axios下,輸出的是=>我是全局message!,為什么呢?我們是想輸出=>”我是vue下的message!”
在這里有那么一些人就蒙了,為什么axios下會(huì)這樣呢?
axios有話說:

出現(xiàn)這種情況,不是axios的鍋,
不信你往下看
//其他代碼省略
getData() {
setTimeout(function () {
console.log(this.message);//=>我是全局message!
}, 1000);
}
}
我們將getData方法下的axios請(qǐng)求換掉,用一個(gè)定時(shí)器替代,其他部分保持不變
輸出依然是=>我是全局message!
為什么?
因?yàn)?/p>
匿名函數(shù)下this指向window
至于原因, 這里解釋的很清楚https://www.zhihu.com/question/21958425
你只需要記住一點(diǎn),默認(rèn)情況下,匿名函數(shù)this指向window
如何處理匿名函數(shù)下this指向的問題呢?
通過bind來處理
結(jié)合之前所學(xué),我們可以同bind來進(jìn)行處理
//部分代碼省略
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);
}
}
在匿名函數(shù)之前,我們先將this賦值給that,在匿名函數(shù)中使用that來替代原來的this,同樣可以實(shí)現(xiàn)我們所希望的效果
如果你的項(xiàng)目支持ES6標(biāo)準(zhǔn),那么
箭頭函數(shù)是你最佳選擇
getData() {
axios.get('https://easy-mock.com/mock/5b0525349ae34e7a89352191/example/promise1')
.then(() => {
console.log(this.message);
})
}
我們?cè)谥暗奈恼轮锌偨Y(jié)過一個(gè)結(jié)論
this的指向是在函數(shù)執(zhí)行的時(shí)候定義的,而不是在函數(shù)創(chuàng)建時(shí)定義的,this指向的是最后調(diào)用它的對(duì)象
我們接下來本篇文章的另一個(gè)知識(shí)點(diǎn)
箭頭函數(shù)中的this
看一個(gè)栗子
var heroName = '黃蓉';
var heroObj = {
heroName: '郭靖',
callName: function () {
console.log(this.heroName)//=>郭靖
}
}
heroObj.callName();
this指向最后調(diào)用它的對(duì)象,所以輸出=>郭靖
再看下箭頭函數(shù)的栗子
var heroName = '黃蓉';
var heroObj = {
heroName: '郭靖',
callName: () => {
console.log(this.heroName)//=>黃蓉
}
}
heroObj.callName();
對(duì)這個(gè)輸出結(jié)果感到意外嗎?
不管懵沒懵,我們?cè)倏匆粋€(gè)栗子
var heroName = '黃蓉';
function getHeroName() {
this.heroName = '郭靖'
const foo = () => {
console.log(this.heroName)//=>郭靖
}
foo();
}
getHeroName();
放在一起做一下比較:
普通函數(shù):this的指向是在函數(shù) 執(zhí)行 的時(shí)候綁定的,而不是在函數(shù) 創(chuàng)建 時(shí)綁定的
箭頭函數(shù):this的指向是在函數(shù) 創(chuàng)建 的時(shí)候綁定的,而不是在函數(shù) 執(zhí)行 時(shí)綁定的。
不管在什么情況下,箭頭函數(shù)的this跟外層function的this一致,外層function的this指向誰,箭頭函數(shù)的this就指向誰,如果外層不是function則指向window。
ES6中定義的時(shí)候綁定的this是繼承的父執(zhí)行上下文里面的this
小程序中的this
如果項(xiàng)目中的小程序也支持ES6標(biāo)準(zhǔn),無疑,使用箭頭函數(shù)是一個(gè)不錯(cuò)的選擇
//省略。。。
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}`
})
}
}
})
}
很多場(chǎng)景就不需要緩存中轉(zhuǎn)this
var that = this//使用箭頭函數(shù)替代此方案
合理的使用this會(huì)使我們事半功倍
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vue在html標(biāo)簽{{}}中調(diào)用函數(shù)的方法總結(jié)及對(duì)比
這篇文章主要給大家介紹了關(guān)于vue在html標(biāo)簽{{}}中調(diào)用函數(shù)的方法總結(jié)及對(duì)比,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-03-03
Vue PC端實(shí)現(xiàn)掃碼登錄功能示例代碼
目前大多數(shù)PC端應(yīng)用都有配套的移動(dòng)端APP,如微信,淘寶等,通過使用手機(jī)APP上的掃一掃功能去掃頁面二維碼圖片進(jìn)行登錄,使得用戶登錄操作更方便,安全,快捷,這篇文章主要介紹了Vue PC端如何實(shí)現(xiàn)掃碼登錄功能,需要的朋友可以參考下2023-01-01
Vue中使用this.$set()如何新增數(shù)據(jù),更新視圖
這篇文章主要介紹了Vue中使用this.$set()實(shí)現(xiàn)新增數(shù)據(jù),更新視圖方式。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Vue.js實(shí)現(xiàn)微信過渡動(dòng)畫左右切換效果
這篇文章主要給大家介紹了利用Vue.js仿微信過渡動(dòng)畫左右切換效果的相關(guān)資料,需要用到的技術(shù)棧是Vue+Vuex。文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-06-06
vue ajax 攔截原理與實(shí)現(xiàn)方法示例
這篇文章主要介紹了vue ajax 攔截原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了vue.js基于ajax攔截實(shí)現(xiàn)無刷新登錄的相關(guān)原理與操作技巧,需要的朋友可以參考下2019-11-11
Vue3.0 響應(yīng)式系統(tǒng)源碼逐行分析講解
這篇文章主要介紹了Vue3.0 響應(yīng)式系統(tǒng)源碼逐行分析講解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10

