javascript(arguments)
来源:互联网 发布:乖离账号数据丢失 编辑:程序博客网 时间:2024/05/23 01:13
原文链接:http://www.cnblogs.com/blfshiye/p/3764137.html
事出有因
今天去做了金山网络招聘实习生的试卷,有一道题目确实让我有点在当时不太肯定,毕竟自己的脑袋还不是javascript解析器,然后回来就打开chrome的控制台,执行后就认为自己要去总结这个知识点了。
题目例如以下(仅仅能说大概,有点忘记,可是考察知识点是一样)
- function foo(a,b,c){
- c = 3;
- console.log(arguments);
- }
- foo(1,2)
- foo(1,2,undefined)
确实当时看见这道题目的时候,心里还是有非常多疑问的,最后仅仅能归结成一个是arguments对象是什么时候才赋值?
了解arguments
- arguments的基本信息
- 1 它不是真正的数组,仅仅是一个类数组的对象,详细两者有什么差别,这个不是我们这篇文章了解的重点;
- 2 它创建于函数定义,并设置为null,赋值于函数调用,它是一个指向函数的參数列表的引用,是函数体訪问形參的接口
- 3 它仅仅能作用于该函数的函数体,在外界訪问这个对象会出错或者仅仅是null
- arguments奇葩行为
- 1 由于它是类数组的对象,它具有一个length属性还有就是能够用下标来訪问參数列表
- 2 由于它是函数的属性,假设你在函数体中又一次定义一个arguments变量,它会覆盖原来的arguments
代码:
- function foo(a,b,c){
- var arguments = 1;
- console.log(arguments);
- }
- foo(1,2)
结果:1
- 3 在非严格的情况下,我们能够通过arguments来改动參数列表
代码:
- function foo(a,b,c){
- arguments[0] = "monkindey";
- console.log(a);
- }
- foo(1,2)
结果:"monkindey"
那好吧,我们还是揭秘金山实习生招聘的笔试题
- foo(1,2)
- 答案:[1,2]
原因:arguments标示符在《javascript权威指南》中指出,它是指向实參对象的引用。实參对象是一个类数组,当实參对象改,那么arguments也会跟着改。而实參对象仅仅有在函数调用时才赋值,比方上面实參对象就类似于{a:1,b:2},可是没有c,所以给c赋值,改变不了实參对象,而arguments是它的引用,所以它也没影响。 - foo(1,2,undefined)
- 答案:[1,2,3]
原因:实參对象会是{a:1,b:2,c:undefined},而在函数体中再改动c的话,就会设置实參对象中的c为3。所以console.log(arguments)会变成[1,2,3]
再练练兵
- 函数内部声明的局部变量与形參同名
- function foo(a,b,c){
- var a = 3;
- console.log(arguments[0]);
- }
- foo(1,2)
- 答案:3
原因:个人认为当我们调用一个函数,传入进去的实參,就是给一个函数中的形參赋值,事实上相当于在函数定义一个局部变量,变量名就是那个形參名,上面的代码能够看成- function foo(a,b,c){
- var a = 1;//传入实參的形參相当于在函数体中定义一个局部变量
- var a = 3;
- console.log(arguments[0]);
- }
- foo(1,2)
- 假设仅仅是声明局部变量a,却不赋值,情况又不一样了
- function foo(a,b,c){
- var a ;
- console.log(arguments[0]);
- }
- foo(1,2)
- 答案:1
原因:上面的代码能够看成- function foo(a,b,c){
- var a = 1;//传入实參的形參相当于在函数体中定义一个局部变量
- var a ;//反复定义一个变量可是又不赋值,javascript解析器会把它忽略掉的(我的猜想)
- console.log(arguments[0]);
- }
- foo(1,2)
參考文献
arguments MDN
《javascript权威指南》
JavaScript函数參数的可改动性
阅读全文
0 0
- javascript ( arguments )
- javascript arguments
- javascript Arguments
- javascript arguments
- JavaScript arguments
- javascript(arguments)
- javascript arguments
- javascript arguments
- javascript arguments
- javascript(arguments)
- Javascript中的arguments 对象
- JavaScript中的arguments对象
- Javascript 的 arguments对象
- javascript的arguments
- Javascript 奇异的 arguments
- arguments: A JavaScript Oddity
- JavaScript中arguments对象
- JavaScript中arguments对象
- javaWEB上传文件讲解
- MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
- 首发 | AIUI开放平台重磅上线!技术小白也能迅速接入!
- 扎克伯格遭股东逼宫,董事长职位或不保?
- 不如意的Siri:从占尽先机到被反超
- javascript(arguments)
- [BZOJ3036][codevs2488]绿豆蛙的归宿(期望dp)
- MyBatis学习总结(三)——优化MyBatis配置文件中的配置
- 如何使用git快速上传项目到GitHub
- JavaWeb框架-Hibernate-3-不厌其烦的CURD!
- Python学习网站集合[持续更新...]
- 摩拜单车接入Apple Pay,将支持iPhone相机扫码解锁
- 考前集训(day1上)
- iPhone换屏将无需等待,苹果自动维修机器曝光