假设我有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>
x
和y
按其各自的按钮递增。
一个相对丑陋的解决方案:
鉴于x
和y
是全局变量,并且 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>
现在我们实际上不应该创建所有这些全局变量。特别是如果它们具有相对简洁的常用名称,例如increase
或x
,即使在您自己的代码中,您也会在知道之前遇到冲突。
如果要使用全局变量,则整个应用程序最多应该使用一个全局变量。以前是离散全局变量的所有内容都成为该全局应用程序对象的属性。
简而言之,试试这个:
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>