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 相关文章推荐
Dom在ajax技术中的作用说明
Oct 25 Javascript
在JavaScript中获取请求的URL参数[正则]
Dec 25 Javascript
Javascript常用字符串判断函数代码分享
Dec 08 Javascript
Javascript仿新浪游戏频道鼠标悬停显示子菜单效果
Aug 21 Javascript
基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
Jun 12 Javascript
Node.JS中事件轮询(Event Loop)的解析
Feb 25 Javascript
微信小程序左右滑动切换页面详解及实例代码
Feb 28 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
Mar 03 Javascript
实例详解vue中的$root和$parent
Apr 29 Javascript
Vue axios 跨域请求无法带上cookie的解决
Sep 08 Javascript
js实现移动端图片滑块验证功能
Sep 29 Javascript
create-react-app开发常用配置教程
Jun 25 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 工厂模式使用方法
2010/05/18 PHP
php 判断服务器操作系统的类型
2014/02/17 PHP
php实现发送微信模板消息的方法
2015/03/07 PHP
ThinkPHP表单数据智能写入create方法实例分析
2015/09/27 PHP
PHP实现获取并生成数据库字典的方法
2016/05/04 PHP
[原创]php求圆周率的简单实现方法
2016/05/30 PHP
php7函数,声明,返回值等新特性介绍
2018/05/25 PHP
OfflineSave离线保存代码再次发布使用说明
2007/05/23 Javascript
javascript 写类方式之十
2009/07/05 Javascript
javascript图像处理—仿射变换深度理解
2013/01/16 Javascript
浅谈JavaScript的事件
2015/02/27 Javascript
jQuery实现点击小图显示大图代码分享
2015/08/25 Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
2016/03/01 Javascript
深入理解JS中的substr和substring
2016/04/26 Javascript
JavaScript类型系统之布尔Boolean类型详解
2016/06/26 Javascript
详解NODEJS的http实现
2018/01/04 NodeJs
layui框架table 数据表格的方法级渲染详解
2018/08/19 Javascript
使用iView Upload 组件实现手动上传图片的示例代码
2018/10/01 Javascript
使用vue完成微信公众号网页小记(推荐)
2019/04/28 Javascript
Postman无法正常返回结果问题解决
2020/08/28 Javascript
python抓取网站的图片并下载到本地的方法
2018/05/22 Python
Django框架验证码用法实例分析
2019/05/10 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
Python基于yaml文件配置logging日志过程解析
2020/06/23 Python
python两种获取剪贴板内容的方法
2020/11/06 Python
浅谈html5 响应式布局
2014/12/24 HTML / CSS
Clarisonic美国官网:科莱丽声波洁面仪
2017/10/12 全球购物
澳大利亚制造的蜡烛和扩散器:Glasshouse Fragrances
2018/05/20 全球购物
缓解脚、腿和背部疼痛:Z-CoiL鞋
2019/03/12 全球购物
大学旷课检讨书
2014/01/28 职场文书
顶撞领导检讨书
2014/01/29 职场文书
工地安全检查制度
2014/02/04 职场文书
服务员岗位职责
2015/02/03 职场文书
详解MySQL的Seconds_Behind_Master
2021/05/18 MySQL
制作能在nginx和IIS中使用的ssl证书
2021/06/21 Servers