javascript:在数组中存储多个变量

javascript:在数组中存储多个变量,javascript,arrays,Javascript,Arrays,我有4个功能:function1,function2,function3,function4 现在,前3个函数中的每一个都在计算一个值。我想将这3个值存储在一个全局数组中,并在第4个函数中使用它 以下方法正确吗 var array1=[] function1(){ array1[0]=calculated value1; } function2(){ array1[1]=calculated value2; } function3(){ array1[2]=calculated value

我有4个功能:
function1
function2
function3
function4

现在,前3个函数中的每一个都在计算一个值。我想将这3个值存储在一个全局数组中,并在第4个函数中使用它

以下方法正确吗

var array1=[]

function1(){
array1[0]=calculated value1;
}

function2(){
array1[1]=calculated value2;
}

function3(){
array1[2]=calculated value3;
}

此数组将用于第四个函数。

不,我不建议这样做

更新: 根据您作为对另一个答案的评论而编写的信息,我猜您的不同函数用于根据用户输入计算某些值

如果您真的想在全局变量中缓存值,我仍然建议您使用具有命名成员的对象,因为在读取和试图理解代码时,它通常比数字索引更有意义:

var myGlobalObject={};

function one(){
  myGlobalObject.nameOfValueOne = calculated value1;
}
如果打印时需要将其作为阵列,则可以创建该阵列:

myPlotFunction( [ myGlobalObject.nameOfValueOne, myGlobalObject.nameOfValueTwo] );

但是如果命名这些值没有意义,比如如果用户可以添加可变数量的值,那么您应该使用数组,可能还应该使用myArray.push(value)不,我不建议这样做

更新: 根据您作为对另一个答案的评论而编写的信息,我猜您的不同函数用于根据用户输入计算某些值

如果您真的想在全局变量中缓存值,我仍然建议您使用具有命名成员的对象,因为在读取和试图理解代码时,它通常比数字索引更有意义:

var myGlobalObject={};

function one(){
  myGlobalObject.nameOfValueOne = calculated value1;
}
如果打印时需要将其作为阵列,则可以创建该阵列:

myPlotFunction( [ myGlobalObject.nameOfValueOne, myGlobalObject.nameOfValueTwo] );

但是如果命名值没有意义,比如如果用户可以添加可变数量的值,那么您应该使用数组,并且可能使用myArray。push(value)除非非常必要,否则不要使用全局变量,如果你真的想使用它,试着使用闭包来确保你不填充全局范围,也让你的变量和函数成为私有的,这样其他同名的全局变量和函数就不会相互影响

尝试将现有代码包装成闭包。这样,我认为您现有的代码一点也不差。全局变量在闭包块中是全局的

 (function($){
  //.. your existing code.
 })(jQuery)

注意:所有变量和函数仅在闭包块中可用

除非非常必要,否则不要使用全局变量,如果您真的想使用它,请尝试使用闭包,以确保您不填充全局范围,并将您的变量和函数设置为私有,这样其他具有相同名称的全局变量和函数就不会相互影响

尝试将现有代码包装成闭包。这样,我认为您现有的代码一点也不差。全局变量在闭包块中是全局的

 (function($){
  //.. your existing code.
 })(jQuery)

注意:所有变量和函数仅在闭包块中可用

因为函数是JavaScript中的第一类对象,所以您可以做一些像这样的黑客行为

var i = 0;
var fa = function() {
  fa.result = "result_" + i;
  i += 1;
};

console.log(fa.result); // prints undefined

// now call fa
fa();

console.log(fa.result); // prints result_0


// now call fa again
fa();

console.log(fa.result); // prints result_1

因此,现在每个函数都存储自己的最后一个结果,您可以在其他函数中使用它。

因为函数是JavaScript中的第一类对象,所以您可以这样做

var i = 0;
var fa = function() {
  fa.result = "result_" + i;
  i += 1;
};

console.log(fa.result); // prints undefined

// now call fa
fa();

console.log(fa.result); // prints result_0


// now call fa again
fa();

console.log(fa.result); // prints result_1

现在,每个函数都存储了自己的最后一个结果,您可以在其他函数中使用它。

下面是另一个与D3.js场景相关的答案,请欣赏

// create a datastructure to hold your array like this
var ArrayHolder = function() {
  var _array = [null, null, null];
  var __nameIndexMap__ = {
    "A": 0,
    "B": 1,
    "C": 2
  };
  Object.defineProperty(this, 'setData', { 
    value: function(name, value) {
      var index = __nameIndexMap__[name];
      if (index >= 0) {
        _array[index] = value;
      }
    }
  });
  Object.defineProperty(this, 'array', {
    get: function() {
      return _array;
    }
  });
};

var myArray = new ArrayHolder();


console.log(myArray.array); // prints [null, null, null]

var i = 0;

function a() {
  // provide each function a name
  var __name__ = "A";
  myArray.setData(__name__, i++);
}

a();

console.log(myArray.array);  // prints [0, null, null]

function b() {
  var __name__ = "B";
  myArray.setData(__name__, i++);
}

b();

console.log(myArray.array); // prints [0, 1, null]

function c() {
  var __name__ = "C";
  myArray.setData(__name__, i++);
}

c();
console.log(myArray.array); // prints [0, 1, 2]


a();
console.log(myArray.array); // prints [3, 1, 2]

下面是与D3.js场景相关的另一个答案,请欣赏

// create a datastructure to hold your array like this
var ArrayHolder = function() {
  var _array = [null, null, null];
  var __nameIndexMap__ = {
    "A": 0,
    "B": 1,
    "C": 2
  };
  Object.defineProperty(this, 'setData', { 
    value: function(name, value) {
      var index = __nameIndexMap__[name];
      if (index >= 0) {
        _array[index] = value;
      }
    }
  });
  Object.defineProperty(this, 'array', {
    get: function() {
      return _array;
    }
  });
};

var myArray = new ArrayHolder();


console.log(myArray.array); // prints [null, null, null]

var i = 0;

function a() {
  // provide each function a name
  var __name__ = "A";
  myArray.setData(__name__, i++);
}

a();

console.log(myArray.array);  // prints [0, null, null]

function b() {
  var __name__ = "B";
  myArray.setData(__name__, i++);
}

b();

console.log(myArray.array); // prints [0, 1, null]

function c() {
  var __name__ = "C";
  myArray.setData(__name__, i++);
}

c();
console.log(myArray.array); // prints [0, 1, 2]


a();
console.log(myArray.array); // prints [3, 1, 2]


你有什么问题吗?或者你只是想找一个更好的方法来做事?该死!我道歉!!是 啊所以我想确认我的方法是否正确。如果有更好的方法,你有什么问题吗?或者你只是在要求一个更好的方法来做事情?该死!我道歉!!是 啊所以我想确认我的方法是否正确。如果有更好的方法,他的函数不会返回任何东西!!生成的数组用作数据集,用于在d3中创建条形图。在那种情况下,我不能使用对象。它必须在数组中。@Reddy我知道伪代码没有返回语句。Cerberus甚至没有写到应该添加结果。我想知道为什么没有使用最常用的方法。@有些我完全同意,无意冒犯,只是想澄清一下。他的函数没有返回任何东西!!生成的数组用作数据集,用于在d3中创建条形图。在那种情况下,我不能使用对象。它必须在数组中。@Reddy我知道伪代码没有返回语句。Cerberus甚至没有写到应该添加结果。我想知道为什么没有使用最常用的方法。@有些我完全同意,无意冒犯,只是想说清楚。这听起来不错!我没有想到这一点。!谢谢。:)jQuery与此有何关系???既然他说的是d3图表,他就必须使用jQuery这听起来不错!我没有想到这一点。!谢谢。:)jQuery与此有何关系???既然他说的是d3图表,他就必须使用jQuery