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 表格插件整理
Apr 27 Javascript
多种方法实现360浏览器下禁止自动填写用户名密码
Jun 16 Javascript
extjs 分页使用jsp传递数据示例
Jul 29 Javascript
jquery实现TAB选项卡鼠标经过带延迟效果的方法
Jul 27 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
Nov 25 Javascript
js调用webservice构造SOAP进行身份验证
Apr 27 Javascript
浅析上传头像示例及其注意事项
Dec 14 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
Jun 21 Javascript
JavaScript事件方法(实例讲解)
Jun 27 Javascript
js实现移动端导航点击自动滑动效果
Jul 18 Javascript
JavaScript使用FileReader实现图片上传预览效果
Mar 27 Javascript
vue之debounce属性被移除及处理详解
Nov 13 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实现时间轴函数代码
2011/10/08 PHP
PHP Error与Logging函数的深入理解
2013/06/03 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
PHP实现常用排序算法的方法
2020/02/05 PHP
使用javascript做的一个随机点名程序
2014/02/13 Javascript
仿百度联盟对联广告实现代码
2014/08/30 Javascript
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
jquery实现动态改变div宽度和高度
2015/05/08 Javascript
用Move.js配合创建CSS3动画的入门指引
2015/07/22 Javascript
聊一聊JS中的prototype
2016/09/29 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
深入解析nodejs HTTP服务
2017/07/25 NodeJs
Angular Renderer (渲染器)的具体使用
2018/05/03 Javascript
JS 实现分页打印功能
2018/05/16 Javascript
通过jquery toggleClass()属性制作文章段落更改背景颜色
2018/05/21 jQuery
BootStrap模态框闪退问题实例代码详解
2018/12/10 Javascript
countUp.js实现数字动态变化效果
2019/10/17 Javascript
vue style width a href动态拼接问题的解决
2020/08/07 Javascript
利用python模拟sql语句对员工表格进行增删改查
2017/07/05 Python
CentOS7下python3.7.0安装教程
2018/07/30 Python
给大家整理了19个pythonic的编程习惯(小结)
2019/09/25 Python
pygame实现俄罗斯方块游戏(AI篇2)
2019/10/29 Python
用python制作个音乐下载器
2021/01/30 Python
百思买加拿大:Best Buy Canada
2018/03/20 全球购物
.NET remoting的两种通道是什么
2016/05/31 面试题
幼儿园实习生辞职信
2014/01/20 职场文书
个人综合鉴定材料
2014/05/23 职场文书
应用外语系自荐信
2014/06/26 职场文书
应届生求职自荐信
2014/07/04 职场文书
反对四风问题自我剖析材料
2014/09/29 职场文书
检讨书模板
2015/01/29 职场文书
大二学年个人总结
2015/03/03 职场文书
银行自荐信怎么写
2015/03/05 职场文书
获奖感言怎么写
2015/07/31 职场文书
Python Matplotlib绘制等高线图与渐变色扇形图
2022/04/14 Python
virtualenv隔离Python环境的问题解析
2022/06/21 Python