javascript函数内的变异

时间:2015-11-01 17:58:37

标签: javascript scope mutation

n00b问题:

假设你调用一个更新数字或字符串的函数

var x = "well";
var helloify = function(str){
  str += "hello"
};

我期待这种行为:

helloify(x);
console.log(x)
\\ "well hello"

但我得到了

\\ "well"

不是“+ =”更改“x”的值?这种变化只会持续存在于功能范围内而不会存在于全球环境中吗?

谢谢!

- 混淆

2 个答案:

答案 0 :(得分:3)

当您致电helloify(x);时,您将x(字符串)的而不是引用传递给x。< / p>

str += "hello"修改str并单独留下x

注意:对象仅通过引用进行寻址,因此如果x是对象的引用,那么您将修改由这两个变量寻址的单个对象。简单的字符串不是对象。

答案 1 :(得分:0)

这是因为参数的发送方式,因为字符串的处理方式,以及+=运算符的实际作用。

参数按值发送,因此函数不会获取字符串变量,它会获取对字符串对象的引用的副本。

字符串是不可变的,这意味着您永远不会更改字符串对象 1 。当你改变一个字符串时,实际上会创建一个带有新值的新字符串。

str += "hello"str = str + "hello"的缩写。这意味着它将创建一个值为str + "hello"的新字符串,并将该字符串对象的引用放在变量str中。

由于参数不是您发送到函数中的变量而是副本,因此为参数指定新字符串不会更改您在函数调用中使用的变量。

1 Javascript引擎实际上可能会更改一个字符串对象,如果它知道该字符串将永远不再使用,即它可以安全地执行,同时保持不可变字符串的行为。