理解Javascript_14_函数形式参数与arguments


Posted in Javascript onOctober 20, 2010

注:在阅读本博文前请先阅读《理解javascript_13_执行模型详解》
注:本文的部分内容是自已的一些推论,并无官文文档作依据,如有错误之后,还望指正。
生涩的代码
我们先来看一段比较生涩的代码:

function say(msg,other,garbage){ 
alert(arguments[1]);//world 
var other = 'nice to meet you!'; 
var msg; 
alert(arguments.length); 
alert(msg);//hello 
alert(other);//nice to meet you! 
alert(arguments[1]);//nice to meet you! 
alert(garbage);//undefined 
} 
say('hello','world');

你能正确的解释代码的执行结果吗?思考一下.

我想代码运行的结果,应该会和你的想象有很大的出入吧!为什么msg正常输出为hello,而不是undefined呢?函数定义的参数和函数内部定义的变量重复了会发生什么呢?arguments和函数定义时的参数有什么关系呢?让我们来一一解答:
简单的内存图
理解Javascript_14_函数形式参数与arguments
注:虚线表示的是曾经引用的指向。

解答

首先,我们来了解两个概念,形式参数和实际参数。形式参数指的是定义方法时所明确指定的参数,由于Javascript语言的灵活性,javascript并不要求方法调用时,所传递的参数个数与形式参数一致.而javascript实际调用时所传递的参数就是实际参数。arguments指的就是实际参数。从say方法中可以看出,say定义了三个形式参数,而实际调用时只传递了两个值。因此arguments.length的值为2,而不是3.接着我们来看一下arguments的特殊行为,个人感觉arguments会将所有的实际参数都当作对象来看待,对于基本数据类型的实际参数则会转换为其对应的对象类型。这是根据在函数内定义与形式参数同名的变量并赋值,arguments对应的值会跟着改变来判断的。
接着我们来分析一下构建say方法执行上下文的过程,由于逻辑比较复杂,这里我写一些'伪代码'来进行说明:

function say(msg,other,garbage){ 
//先对函数声明的变量进行'预解析',内部执行流程,它是是不可见的 
var msg = undefined; 
var other = undefined; 
var garbage = undefined; 
//再对函数内部定义的变量进行'预解析' 
var other = undefined;//很明显,此时这个定义已经无意义了。 
var msg = undefined;//无意义 
//对实际参数进行赋值操作 
msg = new String('hello');//arguments的会将所有实际参数当作对象看待 
other = new String('world'); 
//正式进入函数代码部分 
alert(arguments[1]);//world 
other = 'nice to meet you!'; 
//var msg;这个已经被预解析了,因此不会再执行 
alert(arguments.length);//2 
alert(msg);//hello 
alert(other);//nice to meet you! 
alert(arguments[1]);//nice to meet you! 
alert(garbage);//undefined 
}

这段代码已经可以解释一面的所有的问题了。我就不多说了。
唯一强调的一点是在内部用var定义与形式参数同名的变量是无意义的,因为在程序'预解析'后,会将它们看作为同一个变量。

其它
关于arguments还有很多特性,我在《伪数组》一文中提到也提到了arguments,有兴趣的读者可以去看一下。arguments的实际应用你还可以参考一下这一篇文章 :
http://www.gracecode.com/archives/2551/

好了,也就这么多了。希望大家能多多指正,多提意见吧。

Javascript 相关文章推荐
JSON.parse 解析字符串出错的解决方法
Jul 08 Javascript
jQueryUI写一个调整分类的拖放效果实现代码
May 10 Javascript
如何让页面加载完成后执行js
Jun 26 Javascript
利用js 进行输入框自动匹配字符的小例子
Jun 29 Javascript
用模版生成HTML的的框架jquery.tmpl使用详解
Jan 07 Javascript
JS实现具备延时功能的滑动门菜单效果
Sep 17 Javascript
angularjs中ng-attr的用法详解
Dec 31 Javascript
jQuery实现判断控件是否显示的方法
Jan 11 Javascript
使用 vue.js 构建大型单页应用
Feb 10 Javascript
localstorage实现带过期时间的缓存功能
Jun 28 Javascript
解决vue-router 二级导航默认选中某一选项的问题
Nov 01 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
Feb 12 Javascript
理解Javascript_13_执行模型详解
Oct 20 #Javascript
用jquery与css打造个性化的单选框和复选框
Oct 20 #Javascript
Jquery插件之多图片异步上传
Oct 20 #Javascript
jquery判断checkbox(复选框)是否被选中的代码
Oct 20 #Javascript
jQuery下扩展插件和拓展函数的写法(匿名函数使用的典型例子)
Oct 20 #Javascript
JQuery 拾色器插件发布-jquery.icolor.js
Oct 20 #Javascript
Javascript技巧之不要用for in语句对数组进行遍历
Oct 20 #Javascript
You might like
dedecms中常见问题修改方法总结
2007/03/21 PHP
php 数组的指针操作实现代码
2011/02/08 PHP
ThinkPHP模板自定义标签使用方法
2014/06/26 PHP
Dwz与thinkphp整合下的数据导出到Excel实例
2014/12/04 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
JavaScript内存管理介绍
2015/03/13 Javascript
jQuery实现根据类型自动显示和隐藏表单
2015/03/18 Javascript
jQuery使用toggleClass方法动态添加删除Class样式的方法
2015/03/26 Javascript
jQuery表单美化插件jqTransform使用详解
2015/04/12 Javascript
js中函数声明与函数表达式
2015/06/03 Javascript
常用的javascript设计模式
2017/01/11 Javascript
微信小程序 MD5的方法详解及实例代码
2017/03/10 Javascript
VueJS事件处理器v-on的使用方法
2017/09/27 Javascript
关于自定义Egg.js的请求级别日志详解
2018/12/12 Javascript
微信小程序云开发 生成带参小程序码流程
2019/05/18 Javascript
vue页面切换项目实现转场动画的方法
2019/11/12 Javascript
详解vue beforeEach 死循环问题解决方法
2020/02/25 Javascript
es6函数中的作用域实例分析
2020/04/18 Javascript
swiper实现导航滚动效果
2020/12/13 Javascript
scrapy自定义pipeline类实现将采集数据保存到mongodb的方法
2015/04/16 Python
Python 结巴分词实现关键词抽取分析
2017/10/21 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
2018/06/27 Python
Python3.5面向对象与继承图文实例详解
2019/04/24 Python
django之从html页面表单获取输入的数据实例
2020/03/16 Python
Python基础类继承重写实现原理解析
2020/04/03 Python
踩坑:pytorch中eval模式下结果远差于train模式介绍
2020/06/23 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
2020/07/03 Python
一款利用html5和css3实现的3D立方体旋转效果教程
2016/04/26 HTML / CSS
全球性的在线时尚男装零售商:boohooMAN
2016/12/17 全球购物
英国休闲奢华的缩影:Crew Clothing
2019/05/05 全球购物
标准毕业生自荐信范文
2013/11/04 职场文书
出纳试用期自我鉴定范文
2014/09/16 职场文书
合伙开公司协议书范本
2014/10/28 职场文书
大学生暑假实习总结
2015/07/13 职场文书
SQL注入篇学习之盲注/宽字节注入
2022/03/03 MySQL