Javascript ';vm';对象在Vue实例外部,并在未定义的方法内部调用

Javascript ';vm';对象在Vue实例外部,并在未定义的方法内部调用,javascript,vuejs2,Javascript,Vuejs2,当函数在vue实例外部使用并在装入的方法内部传递时,为什么会丢失对“vm”的引用 var vm=new Vue({ el:“#app-4”, 数据:{ 孤岛加载:正确 }, 挂载:函数(){ 你好; } }); 函数hello(){ log(JSON.stringify(vm)); //vm.isLoading=true; setTimeout(函数(){ log(JSON.stringify(vm,replacer)); //vm.isLoading=false; }) } //额外代码忽

当函数在vue实例外部使用并在装入的方法内部传递时,为什么会丢失对“vm”的引用

var vm=new Vue({
el:“#app-4”,
数据:{
孤岛加载:正确
},
挂载:函数(){
你好;
}
});
函数hello(){
log(JSON.stringify(vm));
//vm.isLoading=true;
setTimeout(函数(){
log(JSON.stringify(vm,replacer));
//vm.isLoading=false;
})
}
//额外代码忽略
SEED=[];
var replacer=函数(键、值){
if(value!=null&&typeof value==“对象”){
如果(见indexOf(值)>=0){
返回;
}
所见。推(值);
}
返回值;
};

Vuejs正在加载


似乎
mounted()
是从Vue构造函数触发的,也就是说,在
vm
变量被赋值之前。因此,
vm
引用没有丢失,但在调用
hello()
时,它仍然是未定义的

Vue
构造函数已返回且
vm
变量已赋值时,将稍后调用
timeout()
回调。这些事件的时间顺序也可以在控制台中看到

var vm=new Vue({
el:“#app-4”,
数据:{
孤岛加载:正确
},
挂载:函数(){
你好;
}
});
函数hello(){
log(“超时前:+typeof(vm));
//vm.isLoading=true;
setTimeout(函数(){
log(“超时后:+typeof(vm));
//vm.isLoading=false;
})
}

Vuejs正在加载


似乎
mounted()
是从Vue构造函数触发的,也就是说,在
vm
变量被赋值之前。因此,
vm
引用没有丢失,但在调用
hello()
时,它仍然是未定义的

Vue
构造函数已返回且
vm
变量已赋值时,将稍后调用
timeout()
回调。这些事件的时间顺序也可以在控制台中看到

var vm=new Vue({
el:“#app-4”,
数据:{
孤岛加载:正确
},
挂载:函数(){
你好;
}
});
函数hello(){
log(“超时前:+typeof(vm));
//vm.isLoading=true;
setTimeout(函数(){
log(“超时后:+typeof(vm));
//vm.isLoading=false;
})
}

Vuejs正在加载


感谢您的解释。那么,编写此代码的最佳Vue方式是什么?我不喜欢使用setTimeout。在第二次尝试中,我将'this'作为hello函数中的参数传递,并进行了操作,但出现了错误。。Vue不应该以更好的方式处理它吗?也许您可以将
hello()
函数作为Vue实例中的一种方法。然后,您甚至不需要分配
vm
,您只需参考
。。。是的,我可以这样做,也可以在Vue实例之外调用它。不管怎样,它都会起作用。也许我需要改变主意,像那样打滚。谢谢你的解释。那么,编写此代码的最佳Vue方式是什么?我不喜欢使用setTimeout。在第二次尝试中,我将'this'作为hello函数中的参数传递,并进行了操作,但出现了错误。。Vue不应该以更好的方式处理它吗?也许您可以将
hello()
函数作为Vue实例中的一种方法。然后,您甚至不需要分配
vm
,您只需参考
。。。是的,我可以这样做,也可以在Vue实例之外调用它。不管怎样,它都会起作用。也许我需要改变主意,像那样打滚。