Javascript 在java脚本中更改函数内对象属性的值不会';它不能正常工作

Javascript 在java脚本中更改函数内对象属性的值不会';它不能正常工作,javascript,pass-by-reference,multi-module,Javascript,Pass By Reference,Multi Module,我有两个模块,在第一个模块中,我声明了一个对象,因为我知道在java脚本中,原语是通过值传递的,对象是通过引用传递的。我想从请求中获取响应状态,我将对象作为引用传递,这样我就能够修改它的属性。问题是它什么都不做。最后值将是相同的 //此代码位于与另一个不同的模块中 var variableToBeChanged={something:“初始值”}; anotherModule.changeValue(可变为更改); 警惕(可变为改变的事物); //在另一个模块中,我有一个$.ajax,我想获得

我有两个模块,在第一个模块中,我声明了一个对象,因为我知道在java脚本中,原语是通过值传递的,对象是通过引用传递的。我想从请求中获取响应状态,我将对象作为引用传递,这样我就能够修改它的属性。问题是它什么都不做。最后值将是相同的

//此代码位于与另一个不同的模块中
var variableToBeChanged={something:“初始值”};
anotherModule.changeValue(可变为更改);
警惕(可变为改变的事物);
//在另一个模块中,我有一个$.ajax,我想获得响应状态(例如200)
//代码如下:
函数AnotherModule(ajax){
函数changeValue(variableToBeChanged){
...
...
...
$.ajax({
...
...
...
成功:函数(数据,xhr){
variableTobechanged.something=xhr.status;
}
});
}

}
在javascript中传递对象引用的副本

这意味着在函数执行完毕后,对对象所做的任何更改都将对您可见

由于javascript是异步的,所以在函数返回之前执行alert(variableToBeChanged.something)这一行。因此你看到了旧的价值。您必须使用回调或承诺同步工作

请参考这个问题。它很好地解释了这个概念。

ajax调用是异步的,因此在修改变量之前会调用警报。您可以像这样在ES6中使用promise,以确保它在ajax调用完成后执行

    new Promise((resolve) =>{ 
             anotherModule.changeValue(variableToBeChanged);
             resolve();
        }).then((res) =>{
            alert(variableToBeChanged.something);
        }).catch((error) =>{
            alert(error);
    });

变量异步改变,因此您必须使用承诺或回调来访问新的值,在您的情况下,您还可以考虑返回Ajax()返回的延迟对象并使用其上的已完成或失败的方法,因为您似乎感兴趣的是调用成功还是失败了模块的方方面面。您好@Stefan,是的,我们可以在成功或失败的情况下从ajax调用返回一个对象,并相应地解决或拒绝承诺。谢谢您的评论!我有一个问题:使用jQuery.ajaxSetup({async:false})和jQuery.ajaxSetup({async:true})是一种不好的做法吗?