javascript内置对象arguments详解


Posted in Javascript onMarch 16, 2014

一、什么是arguments
arguments 是是JavaScript里的一个内置对象,它很古怪,也经常被人所忽视,但实际上是很重要的。所有主要的js函数库都利用了arguments对象。所以agruments对象对于javascript程序员来说是必需熟悉的。
所有的函数都有属于自己的一个arguments对象,它包括了函所要调用的参数。他不是一个数组,如果用typeof arguments,返回的是'object'。虽然我们可以用调用数据的方法来调用arguments。比如length,还有index方法。但是数 组的push和pop对象是不适用的。
二、创建一个灵活的函数
看起来貌似argument对象使用起来十分有限,但是实际上它是一个非常有用的对象。你可以通过使用argument对象让函数能够调用数量不定 的参数。在Dean Edwards的base2库里有个格式化的函数,展示了这个灵活性。

function format(string) {   
  var args = arguments;   
  var pattern = new RegExp(“%([1-" + arguments.length + "])”, ”g”);   
  return String(string).replace(pattern, function(match, index) {   
    return args[index];   
  });   
};

我们提供了一个模板字符串,你可以用”%1”到“%9”给返回值添加一个占位符。然后提供给九个其他参数插入。

format(“And the %1 want to know whose %2 you %3″, ”papers”, ”shirt”, ”wear”);

上面的代码将返回:And the papers want to know whose shirt you wear" .
有件事情我们需要注意下,在定义函数的时候,我们只规定了一个参数,string。Javascript允许我们传递任何数量的参数到一个函数里,不管怎么定义这个函数。Arguments对象对这些都是允许的。
三、把arguments对象转换成一个真正的数组
虽然arguments对象不是一个真正的javascript数组,但是我们还是可以轻易的把它转换成标准的数据 ,然后进行数组操作。
var args = Array.prototype.slice.call(arguments);

那么现在这个变量args就含有一个含有函数所有参数的标准javascript数组对象。
四、通过预置的arguments对象创建函数
Arguments对象允许我们去执行所有类型的javascript方法。这边附上一个makeFunc函数的定义。这个函数允许我们去提供一个函数引用和这个函数的所有参数。他将返回一个匿名函数去调用你规定的函数,也提供了匿名函数调用时所附带的参数。
function makeFunc() {   
  var args = Array.prototype.slice.call(arguments);   
  var func = args.shift();   
  return function() {   
    return func.apply(null, args.concat(Array.prototype.slice.call(arguments)));   
  };   
}

第一个argument对象给makeFunc提供了你想调用的函数的引用。他是从arguments数组里移除的。然后makeFunc返回了一个匿名函数去运行规定的方法。
第一个应用的argument指向了函数调用的范围,主要是函数内部关键部分所指向的。我们先保持这个为null。第二个arguments是一个 数组,会为这个函数转变为arguments对象。makeFunc把原始的数组值串联到arguments对象里提供给匿名函数和所调用函数的数组。
你需要输出一个模板总是相同的位置,这样就可以不用总是在每次引用模板的时候调用format函数。你可以使用makeFunc的通用功能去返回可以调用format然后自动补充模板的函数。

var majorTom = makeFunc(format, ”This is Major Tom to ground control. I'm %1.”);

你可以像这样调用majorTom函数:

majorTom(“stepping through the door”);   
majorTom(“floating in a most peculiar way”);

每一次你调用majorTom,它会同时调用format函数和第一个argument,已经写好的模板。那么将返回
“This is Major Tom to ground control. I'm stepping through the door.”   
“This is Major Tom to ground control. I'm floating in a most peculiar way.”

五、创建引用自身的函数
你可能觉得这样很酷,不过,arguments还有更多的惊喜。他还有其他有用的特性:callee方法 。Arguments.callee包括了一个函数的引用去创建一个argument对象。那么该如何使用呢?
Arguments.callee方法能让一个匿名函数很方便的指向本身。
Repeat是一个承载了一个函数引用和两个数字的函数。第一个数字是函数调用几次,第二个数字是每个调用的间隔时间,单位是毫秒。
function repeat(fn, times, delay) {   
  return function() {   
    if(times? > 0) {   
      fn.apply(null, arguments);   
      var args = Array.prototype.slice.call(arguments);   
      var self = arguments.callee;   
      setTimeout(function(){self.apply(null,args)}, delay);   
    }   
  };   
}

Repeat函数使用了arguments.callee方法从变量self去获取一个引用,指向运行原始指令的函数。这样,匿名函数就可以再次调用本身。
我有一段超级简介的函数,承载了一个字符串和执行alert方法。

function comms(s) {   
  alert(s);   
} 

然而,我想创建一个特殊的版本,通过这个版本我可以重复这个动作三次,每次间隔2秒钟。那么,我们可以

var somethingWrong = repeat(comms, 3, 2000);   
somethingWrong(“Can you hear me, major tom?”);

调用了somethingWrong函数的结果就是复这个动作三次,每次alert间隔2秒钟。
Arguments虽然不是经常用到,有点古怪,但是,它充满了惊喜,非常值得我们去了解 。
Javascript 相关文章推荐
?牟┛途W扣了一??效果出?? target=
May 27 Javascript
Javascript模块模式分析
May 16 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战一)
Aug 21 Javascript
浅析JavaScript中的类型和对象
Nov 29 Javascript
获取鼠标在div中的相对位置的实现代码
Dec 30 Javascript
javascript动态判断html元素并执行不同的操作
Jun 16 Javascript
JS 获取HTML标签内的子节点的方法
Sep 21 Javascript
JS实现淡入淡出图片效果的方法分析
Dec 20 Javascript
Vue2.0 UI框架ElementUI使用方法详解
Apr 14 Javascript
微信小程序基于picker实现级联菜单
Feb 15 Javascript
微信小程序导航栏跟随滑动效果的实现代码
May 14 Javascript
layui问题之渲染数据表格时,仅出现10条数据的解决方法
Sep 12 Javascript
javascript跨浏览器的属性判断方法
Mar 16 #Javascript
JS高级调试技巧:捕获和分析 JavaScript Error详解
Mar 16 #Javascript
Jquery 在页面加载后执行的几种方式
Mar 14 #Javascript
javascript中interval与setTimeOut的区别示例介绍
Mar 14 #Javascript
JavaScript表单通过正则表达式验证电话号码
Mar 14 #Javascript
JavaScript运行时库属性一览表
Mar 14 #Javascript
JavaScript中按位“异或”运算符使用介绍
Mar 14 #Javascript
You might like
收音机玩机评测 406 篇视频合集
2020/03/11 无线电
php 大数据量及海量数据处理算法总结
2011/05/07 PHP
zf框架的zend_cache缓存使用方法(zend框架)
2014/03/14 PHP
PHP中auto_prepend_file与auto_append_file用法实例分析
2014/09/22 PHP
CentOS6.5 编译安装lnmp环境
2014/12/21 PHP
PHP使用Pthread实现的多线程操作实例
2015/11/14 PHP
PHP 二维array转换json的实例讲解
2018/08/21 PHP
关于Curl在Swoole协程中的解决方案详析
2019/09/12 PHP
学习ExtJS TextField常用方法
2009/10/07 Javascript
Javascript事件热键兼容ie|firefox
2010/12/30 Javascript
利用进制转换压缩数字函数分享
2014/01/02 Javascript
认识Knockout及如何使用Knockout绑定上下文
2015/12/25 Javascript
AngularJS实现数据列表的增加、删除和上移下移等功能实例
2016/09/05 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
JS实现购物车特效
2017/02/02 Javascript
微信小程序使用slider设置数据值及switch开关组件功能【附源码下载】
2017/12/09 Javascript
JS运动改变单物体透明度的方法分析
2018/01/23 Javascript
VUE Error: getaddrinfo ENOTFOUND localhost
2018/05/03 Javascript
微信小程序实现刷脸登录
2018/05/25 Javascript
微信小程序request请求封装,验签代码实例
2019/12/04 Javascript
vue不操作dom实现图片轮播的示例代码
2019/12/18 Javascript
jQuery cookie的公共方法封装和使用示例
2020/06/01 jQuery
vue - props 声明数组和对象操作
2020/07/30 Javascript
Python实现读取并保存文件的类
2017/05/11 Python
Python实现的多项式拟合功能示例【基于matplotlib】
2018/05/15 Python
通过Python模块filecmp 对文件比较的实现方法
2018/06/29 Python
windows下numpy下载与安装图文教程
2019/04/02 Python
Cython编译python为so 代码加密示例
2019/12/23 Python
联想香港官方网站及网店:Lenovo香港
2018/04/13 全球购物
美国亚洲时尚和美容产品的一站式网上商店:Stylevana
2019/09/05 全球购物
戛纳奢侈品商店:Jacques Loup法国
2019/11/04 全球购物
程序员跳槽必看面试题总结
2013/06/28 面试题
大二自我鉴定
2014/01/31 职场文书
旷课检讨书范文
2015/01/27 职场文书
大学班长竞选稿
2015/11/20 职场文书
动画《新网球王子 U-17 WORLD CUP》希腊队PV公开
2022/04/02 日漫