Javascript 如果在函数中用作不能再更改的参数,foo会变成什么?
作为函数#1的参数,我到底附加了什么?一个新对象,一个字符串,还有别的什么?它看起来不像一个引用,因为更改foo没有任何效果。从我所看到的,bar1、bar2和Bar3的行为完全相同。它们之间有区别吗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
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