标签:
此文章在阅读了Professional JavaScript for Web Developers 3rd Edition 之有关理解参数的部分后,对此问题的思考。
作者在书中提到,作为函数参数的命名参数(assignment)传入函数内部,实质上是将值传入了函数内部的arguments数组中,按传入的顺序来定义命名参数在数组中的index。
而命名参数的值与arguments数组对应部分的值是同步的,也就是说,当命名参数的值改变,arguments数组对应部分的值也相应地改变了。此外,作者还强调,这两部分在内存中的空间是相独立的,因此只会相互同步,而在内在空间上不影响。
经过以下代码的测试可以得出以上结论是正确的:(测试环境:chrome 43.0.2357.134 m/windows 7 Ultimate)
1 function sumto(num){ 2 alert(arguments[0]+"/"+num); 3 num=12; 4 alert(arguments[0]+"/"+num); 5 arguments[0]=15; 6 alert(arguments[0]+"/"+num); 7 } 8 sumto();//返回三组值:undefined/undefined;undefined/12;15/12 9 sumto(10);//返回三组值:10/10;12/12;15/15
以上代码同时也说明了两个问题:
1、当定义了命名参数,而不向函数中传入参数,则arguments与命名参数如定义未赋值之变量一样,返回undefined。
2、在函数当中修改的不论是命名参数的值还是arguments对应部分的值,两方的值都将改变。
此处,结论2是作者在书中所否定的,作者写道:但这种影响是单向的,修改命名参数不会改变arguments中对应的值。当然,作者整本书对应EMCAScript而言,笔者并未完整地看过EMCAScript-262,暂时无法评判结论的正确与否,仅从测试结果来看,这种影响并非单向的。
标签:
原文地址:http://www.cnblogs.com/orange-ven/p/4658353.html