JS不能增加函数内的全局变量



假设我有Javascript和HTML代码如下:

var x = 1
function increase() {
x += 1
console.log(x)
}
<button onclick="increase()">Click</button>

当我单击按钮时,x增加到 2,但不会进一步增加。为什么x没有变成2,3,4...我怎样才能让x继续增加?

情况

所以显然我的最小示例有效,所以我想我会包括我正在使用这个逻辑并且它不起作用的情况:

.JS:

var x = 1
var y = 1
function increase(number) {
number += 1
console.log(number)
}
<button onclick="increase(x)">Increase x</button>
<button onclick="increase(y)">Increase y</button>

我希望我的控制台显示:

2
3
4
5

但它显示:

2
2
2
2

我真的不明白上面的例子是如何工作的,我的情况也没有

澄清

为了澄清,我想将各种变量传递到函数中(如上所述(,因此,虽然提供的许多答案都有效(我已经对它们投了赞成票(,但它们在我的上下文中不起作用,我应该早点说明这一点。

根据上次编辑(您独立递增多个变量(,问题空间会发生显著变化,使大多数答案不适用。

提供一个足以重现问题的示例非常重要。

无论如何,有很多方法可以实现您想要的结果,鉴于

var x = 1
var y = 1

并给予

<button onclick="increase(x)">Increase x</button>
<button onclick="increase(y)">Increase y</button>

xy按其各自的按钮递增。

一个相对丑陋的解决方案:

鉴于xy是全局变量,并且 JavaScript 中的所有全局变量都是 JavaScript 全局对象的属性(浏览器中window(,你可以写

"use strict";
var x = 1;
var y = 1;
function increase(globalName) {
window[globalName] += 1;
console.log(window[globalName]);
}
<button onclick="increase('x')">Increase x</button>
<button onclick="increase('y')">Increase y</button>

现在我们实际上不应该创建所有这些全局变量。特别是如果它们具有相对简洁的常用名称,例如increasex,即使在您自己的代码中,您也会在知道之前遇到冲突。

如果要使用全局变量,则整个应用程序最多应该使用一个全局变量。以前是离散全局变量的所有内容都成为该全局应用程序对象的属性。

简而言之,试试这个:

var x = 1
function increase(number) {
number += 1
// Also update x
x = number;
console.log(number)
}
<button onclick="increase(x)">Increase</button>

您的问题是单击按钮时没有更新x。因此,x被初始化为1并单击它传递给increase的按钮,然后递增并记录number但永远不会更新x,因此对increase的连续调用继续使用原始值x, 1。

下面是一个最小示例。

因为函数中的number是与函数外部的x分开的变量。变量仅将自身的副本传递给函数。

var x = 1;
x += 1 // x = 2 here;
function increase( number ) {
number += 1
console.log(x)
console.log(number)
}
increase(x)
console.log(x)

如果我们从函数中返回一个值并将其分配给变量,我们将遇到不同的情况

var x = 1;
function increase( number ) {
number += 1
return number;
}
x = increase(x)
console.log(x)

这行得通吗?

var x = 1
function increase(number) {

number = ++x
console.log(number)
}
<button onclick="increase(x)">Increase</button>

这是臭名昭著的引用传递或值传递争论。 这里有一个链接来解释这种情况

所以你的情况是,number作为局部作用域变量复制x的值(你已经传入(,所以现在number = 1,在number += 1之后,number = 2,然后console.log()输出2。

然后再次触发 onclick 函数,局部函数范围变量number不保留引用,因此它再次从变量x的值中复制值(再次值不变(,然后再次重复上述过程。

这是一个JS小提琴片段

var x = { number: 1 };
var y = { number: 1 };
function increase(object) {
object.number++;
document.getElementById("x").innerHTML = x.number;
document.getElementById("y").innerHTML = y.number;
}
console.log(x);
console.log(y);
<!DOCTYPE html>
<html>
<head>
<title>Parcel Sandbox</title>
<meta charset="UTF-8" />
</head>
<body>
<div>
<button onclick="increase(x)">Increase X</button>
<span id="x"></span>
</div>
<div>
<button onclick="increase(y)">Increase Y</button>
<span id="y"></span>
</div>
</body>
</html>

最新更新