Javascript 如果在函数中用作不能再更改的参数,foo会变成什么?

Javascript 如果在函数中用作不能再更改的参数,foo会变成什么?,javascript,function,Javascript,Function,作为函数#1的参数,我到底附加了什么?一个新对象,一个字符串,还有别的什么?它看起来不像一个引用,因为更改foo没有任何效果。从我所看到的,bar1、bar2和Bar3的行为完全相同。它们之间有区别吗 foo = 5; bar1 = (function(){return fooBar(foo);}()); // <--- #1 bar2 = (function(){return fooBar("5");}()); // <--- #2 bar3 = (function(){retu

作为函数#1的参数,我到底附加了什么?一个新对象,一个字符串,还有别的什么?它看起来不像一个引用,因为更改foo没有任何效果。从我所看到的,bar1、bar2和Bar3的行为完全相同。它们之间有区别吗

foo = 5;

bar1 = (function(){return fooBar(foo);}()); // <--- #1
bar2 = (function(){return fooBar("5");}()); // <--- #2
bar3 = (function(){return fooBar(5);}());   // <--- #3

alert(bar1);
alert(bar2);
alert(bar3);
编辑2

function fooBar(n)
{
    return (n[0]+n[1]);
}

foo = [20, 15];
bar = (function(){return fooBar(foo);}());

foo = [4, 565];

alert(bar); // 35

由于
foo
变量是全局变量(定义时没有在外部作用域中定义
var
关键字),因此它也可以在匿名函数中使用

但是,您的
fooBar
函数未定义,很难判断它在做什么

另外,最好使用
console.dir()
转储变量,因为它还显示类型


编辑:显然
console.dir()
不显示类型(至少在Chrome中)

bar1
成为从
fooBar(foo)
返回的结果,它是
fooBar(5)
,计算结果是
3*5
,最后是
15


由于这3条语句是作为自调用函数编写的,
function(){..}()
,因此在
bar1=…
语句之后更改foo将没有任何效果,因为
foo
的值已经传递给它。

请提供
fooBar()
函数。我已经附加了fooBar函数,但这还不是什么复杂的事情。我正在尝试。我能做什么,不能做什么。我没想到这会起作用。foo不会变成任何东西。为什么会这样?您当时只是引用它。好的,但我可以更改foo,bar保持不变的函数,就像它已被转换为常量或字符串一样,因此传递的不是foo。好的,所以它会获取foo的快照并将其存储在某个位置?它是有效的JavaScript吗?它是有效的,但无论如何都不容易阅读。基本上,像
int
string
等基本值都是按值传递的。另一方面,类型
数组
对象
(包括
函数
)是通过引用传递的。
首先计算并接收值
35
,这是正确的。在该点之后更改
foo
不会对
bar
的值产生任何影响。您还想要什么?你想让bar成为一个能记住原始foo值的函数吗?不过,这是一个有趣的练习。
function fooBar(n)
{
    return (n[0]+n[1]);
}

foo = [20, 15];
bar = (function(){return fooBar(foo);}());

foo = [4, 565];

alert(bar); // 35