JavaScript中的奇怪函数行为

时间:2014-09-02 22:09:27

标签: javascript function

我在我的一个项目中执行以下类型的代码,结果令我感到困惑。

function changeSomethingsValue (thingToChange) {
    thingToChange = "something else";
}

var something = "something";

changeSomethingsValue(something);

console.log(something); // prints out "something"

我很困惑为什么something变量的值仍然是字符串"某些东西"在通过changeSomethingsValue函数之后。为什么会发生这种情况?如何让函数将新值分配给传入的任何变量?

2 个答案:

答案 0 :(得分:4)

参数按值传递,而不是通过引用传递。对于字符串,参数是对字符串的引用的副本。通过为其分配新引用来更改函数内的副本不会更改原始文件。

如果传入对象或数组,则可以更改其中的项目,而无需更改对象或数组的引用:

function changeSomethingsValue(thingToChange) {
  thingToChange[0] = "something else";
}

var something = [ "something" ];

changeSomethingsValue(something);

console.log(something[0]); // prints out "something else"

当函数应该有一个值作为输入而更改的值作为输出时的常见模式是返回值:

function changeSomethingsValue(thingToChange) {
  return thingToChange + " else";
}

var something = "something";

something = changeSomethingsValue(something);

console.log(something); // prints out "something else"

答案 1 :(得分:3)

传递基元时,如字符串或数字,它按值传递。您期望的是通过引用传递它。

修复方法是将something设置为changeSomethingsValue

的返回值
function changeSomethingsValue (thingToChange) {
    thingToChange = "something else";

    return thingToChange;
}

var something = "something";

something = changeSomethingsValue(something);

console.log(something); // prints out "something"