setTimeout是window 上的方法,但是在vue中的生命周期钩子函数中,this的指向是vue 实例,那么为什么还可以调用setTimeout?
外部声明了一个变量a,函数内部没有声明,但一样可以用,因为函数作用域没有这个a变量,他会向上层作用域查找,找到就找到了,找不到就报错。
这里也是一样,vue钩子函数里是没有这个setTimeout这个函数,但是他向上找到window上可以找到
最后,this是this,作用域是作用域,他俩不是一个东西,this是作用域的一部分,这里如果你使用的是this.setTimeout反而找不到了,会报错
在js中设定了定时器,时间到了后,会由window去调用定时器的函数并执行,所以定时器中this的指向是window
data(){
return{
message:"这是一条消息"
}
},
methods: {
func(){
var _this = this; //定义_this暂存this
setTimeout(function(){
console.log(_this.message);
},"500");
}
}
这是由于setTimeout函数调用的代码运行在与所在函数完全分离的执行环境上,这会使得this指向的是window对象。