在学习vue.js的时候,官方文档,起步一章节里有这样一段:
处理用户输入
HTML
<div id="app">
<p>{{ message }}</p>
<button v-on:click="reverseMessage">Reverse Message</button>
</div>
JS
new Vue({
el: '#app',
data: {
message: 'Hello Vue.js!'
},
methods: {
reverseMessage: function () {
this.message = this.message.split('').reverse().join('')
}
}
})
例子程序很好理解,点击按钮后,显示的字符串会变化
而我经过扩展,想利用ajax在回调函数中从后台接收参数值然后显示,发现了一个问题:就是this的作用域。下面说几种错误的写法:
1.直接在回调函数中使用this.message
$.ajax({
type: 'GET',
url: ...,
success:function(data) {
this.message = data;
}
});
这样写有明显的错误,回调函数中的this对象和例子程序中的this对象不是同一个
2.创建临时对象
var msg = this.message;
$.ajax({
type: 'GET',
url: ...,
success:function(data) {
msg = data;
}
});
这样写是不对的,因为this.message是个字符串,属于基本类型,将this.message赋值给的msg是另外一个被复制后的新对象(字符串对象),所以在回调函数中再赋值没有任何意义
正确的写法是
var _self = this;
$.ajax({
type: 'GET',
url: ...,
success:function(data) {
_self.message = data;
}
});
这里直接将this赋值给_self,则这个_self属于this的指针引用,即还指向该对象,所以再在回调函数中赋值是有用的