发表于: 2018-06-23 22:48:00
1 753
今日完成:
修改任务十四
学习循环函数、几个内置函数、以及随机函数
任务一可以给三个格子随机的颜色
明日计划:
任务一完成定时函数
今日问题:
函数参数的值传递问题,已经理解,见收货部分。
今日收获:
一。 ECMAScript 中所有函数的参数按值传递。
传值
是把实参的值赋值给行参
那么对行参的修改,不会影响实参的值
传地址
是传值的一种特殊方式,只是他传递的是地址,不是普通的如int
那么传地址以后,实参和行参都指向同一个对象
传引用
真正的以地址的方式传递参数
传递以后,行参和实参都是同一个对象,只是他们名字不同而已
对行参的修改将影响实参的值
1.当参数是值类型的时候
function changeStuff(num){
num = num * 10;
}
var num = 10; //实参复制它的值给形参,就是上面那个num.形参进行运算不影响实参的值。
changeStuff(num);
alert(num);//10
2.当参数是object类型时
(1).function changeStuff1(obj1){
obj1.item = "changed";//此时,形参指向了新建对象的内存地址,并且修改了此地址对象的item属性, 由于实参与形参指向同一个对象,此时,对象属性的改变也反映在实参上。
}
var obj1 = new Object();
obj1.item = "unchanged";
changeStuff1(obj1);//当参数为object时,它的值是保存在内存中的对象,而形参此时复制的是指向内存对象的 指针,
alert(obj1.item);//changed
(2).function changeStuff2(obj2){
obj2 = {item:"changed"};//不同之处
}
var obj2 = new Object();
obj2.item = "unchanged";
changeStuff2(obj2);
alert(obj2.item);//unchanged
(2)和(1)的不同之处在于,实参把指针复制给形参后,实参的指针始终不变,而此时形参发生变化,指向了新的内存地址,所以alert(obj2.item);//unchanged。
如果,obj2是按照引用传递的,那么obj2实参是会自动修改为指向其name属性值为“changed”的新对象。但是,实际上在函数内部修改参数的值,原始的引用保持未变。
最后得出结论,JavaScript 中所有函数的参数都是按值传递的 ,只是对于Object类型来说,这个值本身就是一个指向Object对象的地址。
参考资料出自 https://blog.csdn.net/hangzhou2dan/article/details/39720543
评论