Javascript 离开作用域时丢失数据

Javascript 离开作用域时丢失数据,javascript,ajax,scope,Javascript,Ajax,Scope,我正在用javascript编写一些东西,在某一点上我调用了ajax 我将数据存储在对象文字中,但当我离开作用域时,我会丢失数据(即使是在对象文字中) 我不明白这里发生了什么 var menusView = { menusRep: null, init: function () { this.menusRep = menusRepository; this.getMenus(); }, getMenus: function () { $.ajax({ u

我正在用javascript编写一些东西,在某一点上我调用了ajax 我将数据存储在对象文字中,但当我离开作用域时,我会丢失数据(即使是在对象文字中)

我不明白这里发生了什么

var menusView = {
menusRep: null,
init: function () {
    this.menusRep = menusRepository;
    this.getMenus();
},
getMenus: function () {

    $.ajax({
        url: 'data/voordeelmenus.json',
        dataType: 'json',
        success: function (data) {
            menusView.menusRep.menus = data;
            console.log(data);//console output: [object, object,...]
            console.log(menusView.menusRep.menus);//console output: [object, object,...]
        },
        error: function (error) {
            alert("error reading file: " + error);
        }
    });

    console.log(menusView.menusRep.menus); //console output: []

}
}

var menusRepository = {
menus: []
}
我想我包括了所有重要的代码 提前谢谢

 console.log(menusView.menusRep.menus); //console output: []
必须位于ajax调用内部,因为它是异步的。否则它将永远是空的

编辑:记住打电话

 menusView.init();
否则,menusView.menusRep将为空

希望有帮助


Dan

我认为这是由于AJAX的异步特性以及您如何使用它。最终的console.log是在AJAX调用完成之前触发的,因此在生成console.log时数据不可用

在我看来,你有几个选择。您可以在成功回调中使用返回的数据,在成功回调中使用处理返回数据的另一个方法,或者可以将async设置为false,以阻塞方式处理AJAX请求

 $.ajax({
    url: 'data/voordeelmenus.json',
    dataType: 'json',
    async: false,
    success: function (data) {
        menusView.menusRep.menus = data;
        console.log(data);//console output: [object, object,...]
        console.log(menusView.menusRep.menus);//console output: [object, object,...]
    },
    error: function (error) {
        alert("error reading file: " + error);
    }
});

你基本上有两行

 $.ajax(...)
console.log(...)
ajax行调度ajax调用和回调,在ajax调用返回时调用回调,但不阻塞:它是异步的


计划完成后,将调用console.log,但尚未设置菜单。只有在ajax调用返回时,才会进行设置。

您的ajax调用是异步的

因此,当代码执行到达console.log(menusView.menusRep.menus)时; 当时,您的对象没有收到任何数据


将您的console.log(menusView.menusRep.menumes)放入;在ajax调用的成功处理程序内部

但是ajax调用背后的全部含义是我可以将菜单存储在menusRepository中。(所以我只需要1个ajax调用)现在它只要离开作用域就可以删除数据,然后您应该在ajax调用menusRepository=[something]中执行,我不在menusView.menusRep.menus=data中执行该操作;那么?