Javascript范围不设置全局变量

时间:2016-12-15 10:31:50

标签: javascript scope

我有两个函数,其中一个将对象推入一个数组。它调用另一个函数,该函数从对象中删除键并仅存储数组中的值。

但是,它没有将预期结果设置为全局数组,我将使用其余代码处理它。

     var arr1 = [];
     
     function foo(callback){
      arr1.push({id: 1},{id: 2});
      console.log(JSON.stringify(arr1));
    
      callback(arr1);
     }
     
     foo(function(arr1){
     	bar(arr1);
     });
    
    function bar(arr1){
    	arr1 = arr1.map(x => x.id);
      console.log(JSON.stringify(arr1));
    }

    console.log(JSON.stringify(arr1)); // I want the result to be [1,2]

我可以忽略第二个函数并将其所有内容放入第一个函数中,但这会使事情变得混乱,因为在我的实际代码库中,函数非常复杂。那么有什么方法可以解决这个问题吗?

6 个答案:

答案 0 :(得分:2)

在创建了json对象数组后,你可以编写下面的代码来获取id的数组,它将适合你

var arr = [ {id: 1, data: "data1"},
                {id: 2, data: "data2"}];

var id_array = Object.keys(arr).map(function (k) {
                return arr[k]['id'].toString();
            });

答案 1 :(得分:1)

我不会质疑你的设计 - 听起来你必须简化一些复杂的代码。虽然其他答案提供了可行的替代解决方案,但它并不能解释原因。

JS参数不是" out" - 大致翻译成C,它们只是指针,而不是指针指针。如果替换函数内部的参数值(由map结果执行),则修改将保留在函数范围内。如果您想要修改函数,请应用其他答案提出的任何方法:

  • 将要修改的参数包装为复合对象
  • 使修改成为返回值 - 简单地或在临时复合对象中
  • 使修改成为回调参数

真的没有办法解决它。 JS没有语法,也没有支持输出参数。

答案 2 :(得分:0)

您可以像这样使用json对象来隔离范围,而不必具有来自全局范围的“变量名称”依赖性。

     var arr1 = {arr: []};
     
     function test1(callback){
      arr1.arr.push({id: 1},{id: 2});
      console.log(JSON.stringify(arr1.arr));
    
      callback(arr1);
     }
     
     test1(function(arr1){
     	test(arr1);
     });
    
    function test(arr1){
    	arr1.arr = arr1.arr.map(x => x.id);
      console.log(JSON.stringify(arr1));
    }

    console.log(JSON.stringify(arr1.arr)); // I want the result to be [1,2]

答案 3 :(得分:0)

目前尚不清楚你的代码封闭范围,这可能会在将来导致问题,但如果你的设计真的需要这样的决定 - 在这里你可以采取实际的例子

var arr1 = [];
         
function test1(a, callback){
  a.push({id: 1},{id: 2});
  console.log('1', JSON.stringify(arr1));

  callback(a);
}

test1(arr1, function(a){
  test(a);
});

function test(a){
  //better do not use, but it works
  arr1 = a = a.map(x => x.id);
  console.log('2', JSON.stringify(a));
}

console.log('3', JSON.stringify(arr1)); // I want the result to be [1,2]

答案 4 :(得分:0)

为什么不能让您的代码更简单,并执行类似下面的操作



var arr1 = [];
var arr2 = [];
     
function test1(arr){
  arr.push({id: 1},{id: 2});
  return arr;
}
   
function test(ar){
   ar = arr1.map(x => x.id);
   return ar;
}

var array1 = test(test1(arr1));
console.log(JSON.stringify(array1)); // I want the result to be [1,2]

var array2 = test(test1(arr2));
console.log(JSON.stringify(array2)); // I want the result to be [1,2]




答案 5 :(得分:0)

如果它是一个全局变量,将它作为参数传递给其他函数是没有意义的。你可以做到这一点。

var arr1 = [];

     function test1(callback){
      arr1.push({id: 1},{id: 2});
      console.log(JSON.stringify(arr1));

      callback();
     }

     test1(function(){
        test();
     });

    function test(){
        arr1 = arr1.map(x => x.id);
    }

    console.log(JSON.stringify(arr1));

您实际上并没有替换arr1中全局变量test()的值,而是替换arr1的本地范围内存在的test()的值