在参数中,值不会改变

时间:2013-12-28 01:47:01

标签: javascript parameters

我将使用参数发送的值更改为函数时遇到困难,我不知道为什么它不会更改函数外部的值。我做错了什么? =)

hero= {health:25}

increasehealth(hero.health);

function increasehealth(hp)
{
hp+=5;

}

alert(hero.health);

Here is the script on jfiddle

提前致谢!

2 个答案:

答案 0 :(得分:1)

JavaScript参数按值传递。

您将值5传递给参数hp

hp是来自参数hero.health完全不同的变量。这意味着价值传递意味着什么。该参数是一个新变量。将其绘制为自己独立的框。因此,在这种情况下,更改hp不会影响参数。

如果您将hero传递给hp,并将您的函数正文实现为hp.health += 5,您就会看到自己的期望。这是因为hp当然是一个单独的变量,但它的值是对hero的引用或指针。因此hp.healthhero.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);

Fiddle

// explicit global mutation 

var hero = {health: 25}

function increasehealth(hp) {
    return hp += 5;
}    

hero.health = increasehealth(hero.health);

alert(hero.health);

Fiddle

// 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);

Fiddle