我将使用参数发送的值更改为函数时遇到困难,我不知道为什么它不会更改函数外部的值。我做错了什么? =)
hero= {health:25}
increasehealth(hero.health);
function increasehealth(hp)
{
hp+=5;
}
alert(hero.health);
提前致谢!
答案 0 :(得分:1)
JavaScript参数按值传递。
您将值5传递给参数hp
hp
是来自参数hero.health
的完全不同的变量。这意味着价值传递意味着什么。该参数是一个新变量。将其绘制为自己独立的框。因此,在这种情况下,更改hp
不会影响参数。
如果您将hero
传递给hp
,并将您的函数正文实现为hp.health += 5
,您就会看到自己的期望。这是因为hp
当然是一个单独的变量,但它的值是对hero
的引用或指针。因此hp.health
与hero.health
完全相同,hero.health
会更改。
在图片中:
您的原始代码:
hero +--+ +----+
| hp | 5 |
v +----+
+------------+
| |
| health 25 |
| |
+------------+
此处将hp更改为10会使hero.health保持不变。
现在,另一方面,您将hero
本身传递给hp
:
hero +--+ +----+
| hp | * |
v +-|--+
+------------+ |
| | |
| health 25 |<------------+
| |
+------------+
现在,如果函数的主体说hp.health += 5
跟随指针,看看会发生什么变化!
以下是一种更常用的方法,可以帮助您解答在评论中提出的问题。
您可以创建一个使对象和属性增加的函数,如下所示:
function increase(object, property, amount) {
object[property] += amount;
}
以下是您在英雄示例中使用它的方法:
var hero = {health: 25}
increase(hero, 'health', 5)
现在hero.health
是30。
如果你需要在点击监听器中使用它,它会像这样工作,假设你已经在脚本中的某处设置了必要的三个值:
increaseButton.onclick = function () {increase(obj, prop, amt);}
对于特定按钮,您甚至可以写:
increaseHeroHealthByFiveButton.onclick = function () {increase(hero, 'health', 5);}
答案 1 :(得分:0)
// implicit global mutation
var hero = {health: 25}
function increasehealth() {
hero.health += 5;
}
increasehealth();
alert(hero.health);
// explicit global mutation
var hero = {health: 25}
function increasehealth(hp) {
return hp += 5;
}
hero.health = increasehealth(hero.health);
alert(hero.health);
// Object Oriented (this would be my recommendation)
function Hero() {
this.health = 25;
}
Hero.prototype.increaseHealth = function () {
this.health += 5;
}
var hero = new Hero();
hero.increaseHealth();
alert(hero.health);