写JS代码让自己头秃的点
主要还是自己没系统学习js的锅吧,记录一下。
匿名函数内用this
匿名函数中,this指代的是window对象,不是直观理解中的,局部this,这就会产生undefine的问题。
可以在匿名函数外使用另外的变量名表示。
var vm = this
var f = function () {
vm.count = 1
}
匿名函数中赋值外部变量无效
本质上是因为js是异步执行,按照同步的思路写代码会造成误以为没有赋值成功的错觉,其实是赋值成功了的,只不过是在后面的代码执行之后,他才执行。
但是同步执行很多时候是必要的,可以使用Promise在实现,在then中确保能够同步执行。
首先来个栗子。
// from https://www.runoob.com/w3cnote/javascript-promise-object.html
function ajax(URL) {
return new Promise(function (resolve, reject) {
var req = new XMLHttpRequest();
req.open('GET', URL, true);
req.onload = function () {
if (req.status === 200) {
resolve(req.responseText);
} else {
reject(new Error(req.statusText));
}
};
req.onerror = function () {
reject(new Error(req.statusText));
};
req.send();
});
}
var URL = "/try/ajax/testpromise.php";
ajax(URL).then(function onFulfilled(value){
document.write('内容是:' + value);
}).catch(function onRejected(error){
document.write('错误:' + error);
});
也可以使用async和await来写,这两个关键字学过python比较容易理解。可以理解为自动生成了Promise对象。
async download (url) {
var flag = false
await axios.get(url, {})
.then((res) => {
flag = true
})
.catch((err) => {
flag = false
})
// await使得进程挂起,直到get请求执行完毕,最后再回来return
return flag
}
var down = download('/abc.txt')
down.then((ret) => {
// something to do
console.log(ret)
}).catch((err) => {
console.log(err)
})