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 相关文章推荐
推荐自用 Javascript 缩图函数 (onDOMLoaded)……
Oct 23 Javascript
为Extjs加加速(javascript加速)
Aug 19 Javascript
JavaScript 对象模型 执行模型
Oct 15 Javascript
javascript基础之查找元素的详细介绍(访问节点)
Jul 05 Javascript
js获取隐藏元素宽高的实现方法
May 19 Javascript
浅谈JS原生Ajax,GET和POST
Jun 08 Javascript
AngularJS  $modal弹出框实例代码
Aug 24 Javascript
利用浮层使select不可选的实现方法
Dec 03 Javascript
Angular中响应式表单的三种更新值方法详析
Aug 22 Javascript
vue前后分离调起微信支付
Jul 29 Javascript
Typescript的三种运行方式(小结)
Sep 18 Javascript
vue中element 的upload组件发送请求给后端操作
Sep 07 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
php对数组排序代码分享
2014/02/24 PHP
QQ互联一键登录审核不通过的解决方案
2014/09/10 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
2016/03/15 PHP
TP5框架简单登录功能实现方法示例
2019/10/31 PHP
漂亮的提示信息(带箭头)
2007/03/21 Javascript
JqGrid web打印实现代码
2011/05/31 Javascript
php常见的页面跳转方法汇总
2015/04/15 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
javascript 动态修改css样式方法汇总(四种方法)
2015/08/27 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
微信端开发--登录小程序步骤
2017/01/11 Javascript
Angular表格神器ui-grid应用详解
2017/09/29 Javascript
微信小程序实现多宫格抽奖活动
2020/04/15 Javascript
在vue中使用Autoprefixed的方法
2018/07/27 Javascript
使用webpack编译es6代码的方法步骤
2019/04/28 Javascript
[28:42]Ti4正赛VG vs NEWBEE1
2014/07/19 DOTA
详解用python实现简单的遗传算法
2018/01/02 Python
手把手教你如何安装Pycharm(详细图文教程)
2018/11/28 Python
Python Pywavelet 小波阈值实例
2019/01/09 Python
Python空间数据处理之GDAL读写遥感图像
2019/08/01 Python
python的scipy实现插值的示例代码
2019/11/12 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
2020/01/14 Python
如何基于python实现不邻接植花
2020/05/01 Python
Stuart Weitzman欧盟:美国奢华鞋履品牌
2017/05/24 全球购物
意大利宠物用品购物网站:Bauzaar
2018/09/15 全球购物
Feelunique德国官方网站:欧洲最大的在线美容零售商
2019/07/20 全球购物
Collection和Collections的区别
2016/05/02 面试题
python+selenium小米商城红米K40手机自动抢购的示例代码
2021/03/24 Python
应届毕业生个人自我评价
2013/09/20 职场文书
社会学专业求职信
2014/02/24 职场文书
员工试用期自我评价
2014/09/18 职场文书
表扬信格式模板
2015/05/05 职场文书
新年祝酒词大全
2015/08/11 职场文书
2016年寒假家长评语
2015/10/10 职场文书
党组织关系的介绍信模板
2019/06/21 职场文书
使用CSS实现音波加载效果
2023/05/07 HTML / CSS