var a = 100;
function test(a){
a++; //a(形参)是局部变量
console.log(a);
}
test(a);
console.log(a); //结果是 101 100;
函数的参数是属于函数内部变量,外部无法访问到,即使与外部变量同名;它们也是两个不同的变量
类似于:
var a = 100;
function test( ){
var a=100; //a是局部变量
a++;
console.log(a);
}
test( );
console.log(a); //结果 101 100;
*****************************************************
当函数没有定义参数或者内部没有var 变量,内部的变量默认为全局变量;例如:
var a = 100;
function test( ){
a++ ;
console.log(a);
}
test( );
console.log(a); //第一个返回101;第二个101;a是全局变量
******************************************************
当函数定义了参数,没有传实参时,形参默认为undefined:
var a = 100;
function test(a){
a++ ;
console.log(a);
}
test( );
console.log(a); //第一个返回undefined;第二个100;
**************************************************************
但是如果是通过对象传递参数,函数内部对象属性值发生改变,外部被传递对象的属性值也会改变;
var a= {x:100};
function test (a){
a.x++; //修改参数对象a.x的值,函数外定义的a也将会被修改
console.log(a.x);
}
test(a);
console.log(a.x); // //第一个返回101;第二个101;
总结:通过值传递参数时
在函数中调用的参数是函数参数(属于局部变量范畴).如果函数修改参数值,将不会改变外部被引用的实参值;
通过对象传递参数时
对象属性的变量是相当于一个指针,因此函数修改对象的属性值时,外部的对象属性值也会改变
这也是涉及到基本类型和引用类型的值;基本数据类型(undefined,null,boolean,Number)是按值访问的,所以局部变量与全局变量即使两个名字一样,也是两个不同的变量;
总之 第一、函数参数是被当作变量对待的;第二、参数是按值传递的;第三、传递参数时要确定传递的数据类型;
对象属于引用类型,当变量是一个对象时,将这个变量赋给另一个变量时,相当于另一个变量也变为指针;两个变量都指向同一对象;所以在引用数据类型中,变量相当于一个指针;
(注:javascript高级程序设计第四章 变量、作用域和内存 有详解介绍);