请给出下面这段代码的运行结果( )
<SCRIPT LANGUAGE="JavaScript"> var bb = 1; function aa(bb) { bb = 2; alert(bb); }; aa(bb); alert(bb); </SCRIPT>
var a=100; function foo(x){ x=1; } foo(a); console.log(a)最后输出的结果为100,变量a并没有被修改为1
var a={ x:1, y:2 } function foo(obj){ obj={ x:3, y:4 } } foo(a) console.log(a)最后输出的结果a仍然是{x:1,y:2}。这是因为形参本身是按值传递的,修改形参本身不会造成实参的修改,如果把上面的代码改成如下这样子
var a={ x:1, y:2 } function foo(obj){ obj.x=3; obj.y=4; } foo(a) console.log(a)最后就会很神奇的发现a被修改为了{x:3,y:4},这是因为形参属性所指向的地址与实参所指向的地址一样,修改的形参的属性就同时修改了实参的属性。
ECMAScript中所有函数的参数都是按值传递的。也就是说,把函数外部的值复制给函数内部的参数,就和把一个值从一个变量复制到另外一个变量一样。基本类型的传递如同基本类型变量的复制一样,而引用类型值的传递,则如同引用类型变量的复制一样。在向参数传递基本类型的值时,被传递的值会被复制给一个局部变量(即命名参数,或者用ECMAScript的概念来说,就是arguments对象中的一个元素)。在向参数传递引用类型的值时,会把这个值在内存中的地址复制给一个局部变量,因此这个局部变量的变化会反映在函数的外部。
<SCRIPT LANGUAGE="JavaScript"> var bb = 1; function aa(bb) { var bb; //注意这里,参数实际上就是在方法体中隐式的定义了一个与形参一致的变量 bb = 2; alert(bb); }; aa(bb); // aa(1); 但是在方法体里面对bb进行了重新赋值 bb = 2,所以结果是alert(2) alert(bb); // 这里的bb是全局变量,aa方法体里面的bb = 2并不会影响到全局变量bb,所以结果为alert(1) </SCRIPT>实际的代码是这个样子的,这就容易理解了
这道题考察是局部变量和参数传递的问题。
在aa函数中,bb是以传值的方式传入的,在函数中,会重新定义一个bb变量,并将其值覆为2,并不影响函数体外的bb变量,所以其值仍然为1.