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学习网址备忘
May 29 Javascript
精解window.setTimeout()&amp;window.setInterval()使用方式与参数传递问题!
Nov 23 Javascript
javascript 日期常用的方法
Nov 11 Javascript
通过jquery的$.getJSON做一个跨域ajax请求试验
May 03 Javascript
Javascript 面向对象(二)封装代码
May 23 Javascript
js onload事件不起作用示例分析
Oct 09 Javascript
超级简单的jquery操作表格方法
Dec 15 Javascript
JavaScript简单下拉菜单特效
Sep 13 Javascript
jquery插入兄弟节点的操作方法
Dec 07 Javascript
两种简单的跨域方法(jsonp、php)
Jan 02 Javascript
微信小程序 flex实现导航实例详解
Apr 26 Javascript
vue2.0移除或更改的一些东西(移除index key)
Aug 28 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 获取远程网页内容的函数
2009/09/08 PHP
PHP迅雷、快车、旋风下载专用链转换代码
2010/06/15 PHP
关于php正则匹配汉字的方法介绍
2013/04/25 PHP
js 面向对象的技术创建高级 Web 应用程序
2010/02/25 Javascript
js中方法重载如何实现?以及函数的参数问题
2013/08/01 Javascript
JavaScript代码简单实现求杨辉三角给定行的最大值
2013/10/29 Javascript
js如何获取object类型里的键值
2014/02/18 Javascript
玩转方法:call和apply
2014/05/08 Javascript
javascript实现当前页导航激活的方法
2015/02/27 Javascript
jQuery移动web开发之页面跳转和加载外部页面的实现
2015/12/04 Javascript
JavaScript的Backbone.js框架环境搭建及Hellow world示例
2016/05/07 Javascript
Vue.js报错Failed to resolve filter问题的解决方法
2016/05/25 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
react.js 父子组件数据绑定实时通讯的示例代码
2017/09/25 Javascript
JS计算距当前时间的时间差实例
2017/12/29 Javascript
Vue.js中 v-model 指令的修饰符详解
2018/12/03 Javascript
[07:12]2014DOTA2西雅图国际邀请赛 黑马Liquid专题采访
2014/07/12 DOTA
Python 通过URL打开图片实例详解
2017/06/01 Python
pandas.cut具体使用总结
2019/06/24 Python
python格式化输出保留2位小数的实现方法
2019/07/02 Python
Django后端接收嵌套Json数据及解析详解
2019/07/17 Python
Python算法的时间复杂度和空间复杂度(实例解析)
2019/11/19 Python
python GUI库图形界面开发之PyQt5工具栏控件QToolBar的详细使用方法与实例
2020/02/28 Python
浅析Python打包时包含静态文件处理方法
2021/01/15 Python
CSS3中的clip-path使用攻略
2015/08/03 HTML / CSS
CSS3动画特效在活动页中的应用
2020/01/21 HTML / CSS
经典c++面试题五
2014/12/17 面试题
公司企业表扬信
2014/01/11 职场文书
建议书标准格式
2014/03/12 职场文书
监察建议书范文
2014/03/12 职场文书
教师见习期自我鉴定
2014/04/28 职场文书
置业顾问岗位职责
2015/02/09 职场文书
高考作弊检讨书1500字
2015/02/16 职场文书
新学期小学班主任工作计划
2019/06/21 职场文书
比较node.js和Deno
2021/04/27 Javascript
mysql如何查询连续记录
2022/05/11 MySQL