理解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 相关文章推荐
表单的一些基本用法与技巧
Jul 15 Javascript
在textarea文本域中显示HTML代码的方法
Mar 06 Javascript
JavaScript网页制作特殊效果用随机数
May 22 Javascript
jquery 插件学习(二)
Aug 06 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
Jan 28 Javascript
jQuery基于当前元素进行下一步的遍历
May 20 Javascript
js跨域请求数据的3种常用的方法
Dec 01 Javascript
基于javascript实现根据身份证号码识别性别和年龄
Jan 22 Javascript
JavaScript中关键字 in 的使用方法详解
Oct 17 Javascript
基于js中的原型(全面讲解)
Sep 19 Javascript
使用vue脚手架(vue-cli)搭建一个项目详解
May 09 Javascript
使用apifm-wxapi快速开发小程序过程详解
Aug 05 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
德生1994机评
2021/03/02 无线电
UserData用法总结 lanyu出品
2010/07/01 Javascript
ModelDialog JavaScript模态对话框类代码
2011/04/17 Javascript
Javascript实现仿WebQQ界面的“浮云”兼容 IE7以上版本及FF
2011/04/27 Javascript
THREE.JS入门教程(1)THREE.JS使用前了解
2013/01/24 Javascript
基于jQuery实现仿淘宝套餐选择插件
2015/03/04 Javascript
js实现的Easy Tabs选项卡用法实例
2015/09/06 Javascript
js格式化输入框内金额、银行卡号
2016/02/01 Javascript
JSON格式的时间/Date(2367828670431)/格式转为正常的年-月-日 格式的代码
2016/07/27 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
seajs学习教程之基础篇
2016/10/20 Javascript
解析微信JS-SDK配置授权,实现分享接口
2016/12/09 Javascript
基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析
2017/01/12 NodeJs
JS正则表达式验证密码格式的集中情况总结
2017/02/23 Javascript
jQuery实现扑克正反面翻牌效果
2017/03/10 Javascript
浅谈vue方法内的方法使用this的问题
2018/09/15 Javascript
vue模块拖拽实现示例代码
2019/03/09 Javascript
记录vue做微信自定义分享的一些问题
2019/09/12 Javascript
Windows下搭建python开发环境详细步骤
2020/07/20 Python
python中Matplotlib实现绘制3D图的示例代码
2017/09/04 Python
利用python操作SQLite数据库及文件操作详解
2017/09/22 Python
python实现数独游戏 java简单实现数独游戏
2018/03/30 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
2018/04/20 Python
判断python字典中key是否存在的两种方法
2018/08/10 Python
python写日志文件操作类与应用示例
2019/07/01 Python
python正则爬取某段子网站前20页段子(request库)过程解析
2019/08/10 Python
Python基于WordCloud制作词云图
2019/11/29 Python
俄罗斯极限运动网上商店:Board Shop №1
2020/12/18 全球购物
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
2015年药店工作总结
2015/04/20 职场文书
2015年行政执法工作总结
2015/05/23 职场文书
酒店员工管理制度
2015/08/05 职场文书
单位病假条范文
2015/08/17 职场文书
Linux、ubuntu系统下查看显卡型号、显卡信息详解
2022/04/07 Servers
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
2022/04/09 MySQL
JavaScript原型链中函数和对象的理解
2022/06/16 Javascript