参数有两种:一种是基本类型的(Undefined,Null,Boolean,Number,String),另一种是引用类型的(Object)这两种参数传递的时候会有不一样。
基本类型很简单。就是把值复制过去,然后里面怎么变化是里面的事情,和原来有值的那个无关。
代码如下:
<!DOCTYPE html>
<html>
<head>
<title>Function Arguments Example 1</title>
<script type="text/javascript">
function addTen(num) {
num += 10;
return num;
}
var count = 20;
var result = addTen(count);
alert(count); //20
alert(result); //10
</script>
</head>
<body>
</body>
</html>
解释一下:
由于count作为参数传进来了,所以它的值被复制了一份在num里面。然后num怎么变和count无关。count还是那个count。
翻译成人话:
相当于是我在博物馆复印了一幅蒙娜丽莎,一模一样,然后不管是给复制品加相框,改颜色还是撕毁它,都和真货没关系,真货还在博物馆里墙上挂着呐....
引用类型的有点小复杂,但知道了原理其实也容易。
代码如下:
<!DOCTYPE html>
<html>
<head>
<meta name="name" content="content" charset = "utf-8";>
<title>小黄毛的传参。</title>
<script type="text/javascript">
function setName(obj) {
obj.name = "Nicholas";
obj = new Object();
obj.name = "Susan";
console.log("我是函数里面的"+obj.name);
abc = 10;
}
var person = new Object();
setName(person);
console.log(person.name); //"Nicholas"
console.log(abc);
console.log("在外面调用obj试试~"+obj.name);
</script>
</head>
<body>
</body>
</html>
显示如下:
结果如上:
一、在函数setName之外,abc输出10(蓝色的3);obj is not defined(黑色的4)。
二、obj.name输出结果为susan(红色的1),person.name输出结果为Nicholas(黄色的2)。
一的原因:
首先,obj是个局部变量。
解释一下:
1. function setName(obj){ }长这样表示 obj是个参数。//传闻中的形参
2. function setName(obj){ } 等价于 function setName(obj) {var obj = null; }
所以,酱紫就注定了obj是个在函数setName里面的局部变量~~2333~~小样儿~(在小黄毛的认知范围内,)你就永远都是局部变量啦~~
其次,abc是个全局变量
解释一下:
虽然在函数体里,但是,定义的时候前面没有var。所以默认为全局变量。
综上,结果很明确了。
在函数setName外面console.log();,这俩变量的结果就是全局变量abc输出10(蓝色的3);局部变量obj is not defined(黑色的4)。
二的原因:
var person = new Object();
这句话的意思其实是酱紫的.....开辟一个小地址,用 指针 指到对象object上。
所以,所谓的赋值,比如要把person作为参数传到函数setName的参数obj 里.....
就是下图酱紫。
由于指向的是同一个object,所以,不管是obj还是person,修改了属性以后对方的属性都会保持最新的那个。
然后,下面的代码又做了这么一件事:
obj = new Object();
在图上就是酱紫:
在改了这句之后,person指向的一切与obj无关了~新世界来临了~
一切都是新的~~
翻译成人话就是:
person是个美国男人,setName()是个没国籍的女人,她带了一个孩子obj,也没国籍。person和setName结婚了,他大方地说:让obj随我的国籍吧~然后person和obj就都成美国公民了,他们都有权利修改宪法,但是呢,管用的宪法只有一个版本,就是最新版本。
后来呢,obj长大了,经过考虑,他开心得决定加入中国国籍,所以,他指定中国法律的一切和美国男人无关~美国的法律也和他无关了~他只和中国法律有关。
了解了原理,回来看代码:
随着函数的进行,obj做了这么几件事:
1.加了一个属性:obj.name="Nicholas";//改了美国的宪法 object1的属性
2.指向了一个新地址:new Object();//变成 了中国国籍 从指向object1变为指向object2
3.新地址里添加了一个属性 obj.name = "Susan";//改了中国宪法 即object2的属性
所以,obj.name(指向object2)输出结果为susan(红色的1),person.name(指向object1)输出结果为Nicholas(黄色的2)。
以上。