引言
在写本文之时,笔者遇到一些访问域的界限问题。依据自己的理解,js部分如果没能弄清楚变量各自的访问域问题,写起js是一团迷乱,虽然能写,总有些不舒服~
我们就从var that=this开篇来介绍。
var that = this
我们还是通过一段示例去理解var that =this吧,直接说也没能那么清楚。
视图页面:
<view class="btn">
<button type="primary" size="default" bindtap="showactionsheet">选择国家</button>
</view>
文件页面
Page({
data:{
itemLists: ['中国', '美国', '日本', '英国']
},
showactionsheet: function () {
wx.showActionSheet({
itemList: this.data.itemLists,
itemColor: "red",
success: function (res) {
if (!res.cancel) {
console.log(res);
}
}
})
}
})
从调试窗口可以看到接口调用成功后 success函数回调返回的参数是一个对象 ,其中只有tapIndex代表点击中的项目索引(从上往下index从0开始),如果用户点击的是取消,则返回一个布尔类型的cancel,并且cancel="true"!这时候,如果我们想打印点击的项目的文本,就只能通过tapIndex索引去数组里面显示,聪明的你一定会想到
function (res) {
if (!res.cancel) {
console.log(this.data.itemLists[res.tapIndex]);
}
}
这时候我们发现报错了
原因是说itemLists
未定义。我们尝试把对象this.data
也打印出来。同样发现是undefined
.
由此引入重要的 var that=this
原来我们忘记了javascript
语言中this
关键字的用法了。在javascript语言中,this
代表着当前的对象
,它在程序中随着执行的上下文随时会变化。在本例中回调函数对象相对于showactionsheet
点击事件函数对象已经发生了变化。所以已经不是原来的页面对象了。自然就没有了data
属性,也没有了data.itemLists
属性了。解决的办法就是复制一份当前的对象。所以我们有了这个重要的语句:
var that=this;//把this对象复制到临时变量that.
这时候我们使用that 就不会找不到原来的对象了。
console.log(that.data.itemLists[res.tapIndex]);//使用that.data 属性
其它接口也一样
这里虽然只是举例了一个接口。但是鉴于微信小程序几乎所有的API接口都会有success
, fail
, complete
三个回调函数来处理业务的后续逻辑,很多时候我们要获取当前页面对象来对视图进行渲染。当我们想要获取页面的初始数据data
时候,在回调函数里面就不能使用 this.data
来获取,同样的就不能使用this.setData()
函数来渲染视图。我们需要做的就是在把我们想要的this对象想复制到that.因此就有了本文的解说 重要的 var that=this .希望能够给正在学习微信小程序开发的初学者帮助。
关于javascript this的用法大家还是要通过实例去好好理解。这里不再详细的解释。这里附送一个传送门,可以看看这篇写得很好的 关于深入理解this的文章: