Javascript:如何创建一个1。接受全局变量作为参数2。更改该全局变量的值?

Javascript:如何创建一个1。接受全局变量作为参数2。更改该全局变量的值?,javascript,global-variables,Javascript,Global Variables,我试图创建一个函数,它接受一个全局变量作为参数,并更改该全局变量的值。下面是一个简单的例子,说明了我要做的事情: var number = 20; function setnew(num) { num += 1; }; setnew(number); console.log(number) //-> 20 //I want this to return 21 即使在调用setnew函数后,number仍保持不变。有人能解释一下为什么numbe

我试图创建一个函数,它接受一个全局变量作为参数,并更改该全局变量的值。下面是一个简单的例子,说明了我要做的事情:

var number = 20;
function setnew(num) {
  num += 1;
};

setnew(number);
console.log(number) //-> 20
                    //I want this to return 21

即使在调用
setnew
函数后,
number
仍保持不变。有人能解释一下为什么
number
保持不变,并提出实现我预期目标的另一种方法吗?

因为Javascript不支持真正的引用传递,您可以在其中更改原始变量,所以您不能直接执行您要求的操作。通常的解决方法是将全局对象包装到对象中

var myGlobal = {
     counter: 0;
};

function increment(obj, prop) {
  ++obj[prop];
}

increment(myGlobal, "counter");
increment(myGlobal, "counter");

console.log(myGlobal.counter);   // 2

或者,如果属性名称已知,则可以执行以下操作:

var myGlobal = {
     counter: 0;
};

function incrementCnt(obj) {
  ++obj.counter;
}

incrementCnt(myGlobal);
incrementCnt(myGlobal);

console.log(myGlobal.counter);   // 2

这是因为当您将对象传递给函数时,传递的是指向同一对象的指针(对象不会被复制)。因此,如果您修改该对象上的任何属性,则该对象只有一个副本,因此您正在修改该对象的一个副本上的属性,并且所有引用该对象的人都将看到该属性的更改

像数字和布尔值这样的原语是通过值传递的,该值的作用类似于复制,因此原语永远不会受到函数的影响


有人能解释一下为什么编号保持不变并建议另一个吗 如何实现我的预期目标

将数字传递给函数时,该数字的值将复制到作为函数参数的新变量。将该参数的值更改为函数只会影响该参数-它与原始变量没有任何连接。这是因为在Javascript中,原语是通过值传递的,而不是通过引用传递的。因此,根本没有对值的来源进行任何引用。当您在函数中收到它时,它是一个独立的新变量


另一种可能的解决方法是从函数返回修改后的值,并允许调用者将修改后的值分配给他们想要的任何对象:

var counter = 0;

function increment(val) {
  return val + 10;
}

counter = increment(counter);

console.log(counter);   // 10

如果要传入对象而不是基本体,则可以对其进行更新

例如:

var number = { value: 20 };
function setnew(num) {
  num.value += 1;
};

setnew(number);
console.log(number.value) //-> 21
基本上,当您传入一个对象时,javascript实际上只传递一个对变量的引用,而当您传入一个整数时,它将传递一个值的副本