<
script
>
//ECMAScript函数传递的参数可以是0到多个,可以是任意数据类型。没有函数签名的概念,所以函数不能重载。
function
doAdd
(
num1
,
num2
){
arguments
[
1
]
=
10
;
//arguments对象可以与命名参数一起使用。
alert(
arguments
[
0
]
+
num2);
//NaN。没有传递值的命名参数将被自动赋予undefined。
alert(
arguments
[
0
]
+
arguments
[
1
]);
//15。ECMAScript函数中的命名参数只是提供便利,并不是必须的。
alert(
arguments
.length);
//1。arguments对象的长度是由传入的参数个数决定的,不是由定义函数时的命名参数的个数决定的。
}
doAdd(
5
);
//只传入一个参数,所以arguments[1]设置的值不会反应到命名参数中。
//arguments对象是类数组,不是Array的实例。
</
script
>
<
script
>
function
doAdd2
(
num1
,
num2
){
arguments
[
1
]
=
10
;
//严格模式下,重写arguments的值会导致错误。
alert(
arguments
[
0
]
+
num2);
//30
alert(
arguments
[
0
]
+
arguments
[
1
]);
//30。num2和arguments[1]的内存空间是独立的,但他们的值是同步的。
alert(
arguments
.length);
//2
}
doAdd2(
20
,
30
);
</
script
>
<
script
>
function
addTen
(
num
){
num
+=
10
;
return
num;
}
var
count
=
20
;
var
result
=
addTen(count);
var
num
=
30
;
var
result2
=
addTen(num);
//如果未对num进行声明并且赋值,此处将会报错。这里的num与函数里面的形参num无关。
alert(count);
//20。参数是按值传递的,所以传递的是20,而不是变量count。
alert(result);
//30
alert(num);
//30
alert(result2);
//40
</
script
>
<
script
>
function
setName
(
obj
){
obj.name
=
"Jame"
;
}
var
person
= new
Object();
//person指向的对象在堆内存中只有一个,且是全局对象。
setName(person);
//obj和person引用的是同一个对象。
alert(person.name);
//"Jame"
</
script
>
<
script
>
function
setName
(
obj
){
obj.name
=
"Jame"
;
console
.log(obj);
//{name: "Jame"}
obj
= new
Object();
//
当在函数内部重写obj时,这个变量引用的就是一个局部对象,这个局部对象会在函数执行完毕后立即被销毁。
obj.name
=
"Tom"
;
//
在函数内部修改了参数不会影响到原始的引用person
console
.log(obj);
//{name: "Tom"}
}
var
person
= new
Object();
setName(person);
//(参数是按值传递,而不是按引用传递)多了这句话反而不好理解。
console
.log(person);
//{name: "Jame"}
console
.log(person.name);
//"Jame";
</
script
>
//
把ECMAScript中的参数想象成局部变量。