JavaScript中如何将多个函数传入的对象收集至同一数组?
解决对象累积到同一数组的问题
问题根源在于objCollect是在PlaceData函数内部声明的,每次调用该函数都会重新初始化一个空数组,所以只能保存当前传入的对象。以下是几种可行的解决方案:
方案一:将数组放在共享作用域中
把数组声明在两个函数都能访问的作用域(比如全局作用域),避免每次调用PlaceData都重新创建数组:
// 声明在全局作用域或两个函数的父作用域中 var objCollect = []; function GetData(query) { var json = ""; var api_url = ('https://jsondata.site?conn={conn}&query={query}'); // 修正AJAX配置里的分号为逗号 $.ajax({async: false, url: api_url, method: "GET"}).done(function(data){ json = JSON.parse(data); }); PlaceData(json); }; function PlaceData(data) { objCollect.push(data); console.log(objCollect); };
方案二:用闭包封装数组
通过闭包将数组私有化,避免污染全局作用域:
// 用立即执行函数创建闭包,保存数组状态 var PlaceData = (function() { var objCollect = []; return function(data) { objCollect.push(data); console.log(objCollect); } })(); function GetData(query) { var json = ""; var api_url = ('https://jsondata.site?conn={conn}&query={query}'); $.ajax({async: false, url: api_url, method: "GET"}).done(function(data){ json = JSON.parse(data); }); PlaceData(json); };
方案三:将数组作为函数属性
把数组挂载到PlaceData函数本身作为属性,既不会污染全局,又能保持状态:
function GetData(query) { var json = ""; var api_url = ('https://jsondata.site?conn={conn}&query={query}'); $.ajax({async: false, url: api_url, method: "GET"}).done(function(data){ json = JSON.parse(data); }); PlaceData(json); }; function PlaceData(data) { // 仅在第一次调用时初始化数组 if (!PlaceData.objCollect) { PlaceData.objCollect = []; } PlaceData.objCollect.push(data); console.log(PlaceData.objCollect); };
注意:原代码中AJAX配置的async: false后面使用了分号,这会导致语法错误,上述方案中已修正为逗号。
内容的提问来源于stack exchange,提问作者E0132630
相关产品推荐
相关产品推荐

