Javascript学习笔记之函数篇(四):arguments 对象


Posted in Javascript onNovember 23, 2014

每一个 Javascript 函数都能在自己作用域内访问一个特殊的变量 - arguments。这个变量含有一个传递给函数的所有参数的列表。
arguments 对象不是一个数组。尽管在语法上它跟数组有相同的地方,例如它拥有 length 属性。但它并不是从 Array.prototype 继承而来,实际上,它就是一个对象。
因此,我们不能直接对 arguments 使用一些数组的方法,例如 push, pop 或 slice 等。 所以为了使用这些方法,我们就需要将其转换为一个真正的数组。

转化为数组

下面的代码将会返回一个包含 arguments 对象所有元素的数组。

Array.prototype.slice.call(arguments);
由于转化的速度很慢,所以在性能要求严格的程序中不建议这样做。

传递参数

下面是一种比较推荐的方法,将 arguments 对象从一个函数传递到另一个函数。

function foo() {

    bar.apply(null, arguments);

}

function bar(a, b, c) {

    // do stuff here

}

另外还有一个比较巧妙的方法,就是同时使用 call 和 apply 快速创建一个解绑的外层方法。

function Foo() {}

Foo.prototype.method = function(a, b, c) {

    console.log(this, a, b, c);

};

// Create an unbound version of "method" 

// It takes the parameters: this, arg1, arg2...argN

Foo.method = function() {

    // Result: Foo.prototype.method.call(this, arg1, arg2... argN)

    Function.call.apply(Foo.prototype.method, arguments);

};

函数形参和 arguments 属性的关系

arguments 对象为它自身属性和函数的形参都创建了 getter 和 setter 方法。
因此,修改函数的形参会影响对应的 arguments 对象的属性值,反之亦然。

function foo(a, b, c) {

    arguments[0] = 2;

    a; // 2

    b = 4;

    arguments[1]; // 4

    var d = c;

    d = 9;

    c; // 3

}

foo(1, 2, 3);

性能问题

arguments 只在两种情况下不会被创建,一是在函数内部被声明为局部变量,二是当做函数的形参。其他情况,arguments 对象总是会被创建。
由于 getter 和 setter 方法总是会随着 arguments 对象的创建而创建,因此使用 arguments 对性能本身几乎没有影响。
然而,有一种情形会严重影响 Javascript 的性能,那就是使用 arguments.callee。

function foo() {

    arguments.callee; // do something with this function object

    arguments.callee.caller; // and the calling function object

}

function bigLoop() {

    for(var i = 0; i < 100000; i++) {

        foo(); // Would normally be inlined...

    }

}

在上述代码中,foo 函数不再是一个简单的内联扩展,因为它需要知道它自身以及它的调用者(caller)。这不仅抵消了内联扩展所带来的性能提升,同时也破坏了函数的封装性,因为函数本身可能需要依赖于一个特定的调用背景。
因此,建议大家尽量不要使用 arguments.callee。

以上就是关于Javascript arguments 对象的全部内容了,小伙伴们是否了解透彻呢,简单的说

arguments指函数的参数对象(指实际传入的参数)
arguments.length指函数的参数对象的长度
arguments[i]指第i个参数的值(第一个为0)

Javascript 相关文章推荐
一个小例子解释如何来阻止Jquery事件冒泡
Jul 17 Javascript
跟我学习JScript的Bug与内存管理
Nov 18 Javascript
javascript和jquery实现用户登录验证
May 04 Javascript
React + webpack 环境配置的方法步骤
Sep 07 Javascript
vue实现图书管理demo详解
Oct 17 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
Jan 30 Javascript
在vue里使用codemirror遇到的问题
Nov 01 Javascript
vue.js多页面开发环境搭建过程
Apr 24 Javascript
vue使用websocket的方法实例分析
Jun 22 Javascript
js实现掷骰子小游戏
Oct 24 Javascript
JavaScript 浏览器对象模型BOM原理与常见用法实例分析
Dec 16 Javascript
react 原生实现头像滚动播放的示例
Apr 21 Javascript
Javascript学习笔记之 函数篇(三) : 闭包和引用
Nov 23 #Javascript
js实例属性和原型属性示例详解
Nov 23 #Javascript
JS常用函数使用指南
Nov 23 #Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
Nov 23 #Javascript
理解jQuery stop()方法
Nov 21 #Javascript
JS中三目运算符和if else的区别分析与示例
Nov 21 #Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
Nov 20 #Javascript
You might like
ThinkPHP入库出现两次反斜线转义及数据库类转义的解决方法
2014/11/04 PHP
php使用cookie实现记住用户名和密码实现代码
2015/04/27 PHP
php自定义函数实现JS的escape的方法示例
2016/07/07 PHP
php实现贪吃蛇小游戏
2016/07/26 PHP
JavaScript For Beginners(转载)
2007/01/05 Javascript
JavaScript 高级语法介绍
2009/06/15 Javascript
jquery js 获取时间差、时间格式具体代码
2013/06/05 Javascript
解析ScrollPic在ie8下只滚动一遍,然后变为空白 ie6,ie7,chrome,firefox正常
2013/06/26 Javascript
javascript获取checkbox复选框获取选中的选项
2014/08/12 Javascript
浅谈jQuery的offset()方法及示例分享
2015/07/17 Javascript
javascript中Date format(js日期格式化)方法小结
2015/12/17 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
微信小程序 支付功能开发错误总结
2017/02/21 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
2017/03/21 Javascript
深入理解Vue 单向数据流的原理
2017/11/09 Javascript
基于input动态模糊查询的实现方法
2017/12/12 Javascript
JS计算输出100元钱买100只鸡问题的解决方法
2018/01/04 Javascript
JS实现用特殊符号替换字符串的中间部分区域的实例代码
2018/07/24 Javascript
vue移动端使用appClound拉起支付宝支付的实现方法
2019/11/21 Javascript
优化Vue中date format的性能详解
2020/01/13 Javascript
Python hexstring-list-str之间的转换方法
2019/06/12 Python
Python创建或生成列表的操作方法
2019/06/19 Python
基于Python和PyYAML读取yaml配置文件数据
2020/01/13 Python
Python爬虫之App爬虫视频下载的实现
2020/12/08 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
雅诗兰黛香港官网:Estee Lauder香港
2017/09/26 全球购物
美国滑雪板和装备购物网站:Skis.com
2018/12/20 全球购物
捷克玩具商店:Bambule
2019/02/23 全球购物
俄语翻译实习生的自我评价分享
2013/11/06 职场文书
大一新生军训时的自我评价分享
2013/12/05 职场文书
企业标语大全
2014/07/01 职场文书
公司财务部岗位职责
2015/04/14 职场文书
追悼会答谢词范文
2015/09/29 职场文书
幼儿园六一儿童节开幕词
2016/03/04 职场文书
详解TypeScript中的类型保护
2021/04/29 Javascript
MySQL官方导出工具mysqlpump的使用
2021/05/21 MySQL