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之大字符串的连接的StringBuffer 类
May 08 Javascript
DOMAssitant最新版 DOMAssistant 2.5发布
Dec 25 Javascript
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
Apr 02 Javascript
jQuery 重复加载错误以及修复方法
Dec 16 Javascript
jQuery左右滚动支持图片放大缩略图图片轮播代码分享
Aug 26 Javascript
基于jquery实现图片相关操作(重绘、获取尺寸、调整大小、缩放)
Dec 25 Javascript
基于vue的换肤功能的示例代码
Oct 10 Javascript
Rollup处理并打包JS文件项目实例代码
May 31 Javascript
vue项目中axios请求网络接口封装的示例代码
Dec 18 Javascript
LayUI switch 开关监听 获取属性值、更改状态的方法
Sep 21 Javascript
js实现多个标题吸顶效果
Jan 08 Javascript
JS前端轻量fabric.js系列之画布初始化
Aug 05 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文件下载类
2006/12/06 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
win7安装php框架Yii的方法
2016/01/25 PHP
ThinkPHP实现登录退出功能
2017/06/29 PHP
静态的动态续篇之来点XML
2006/08/15 Javascript
js url传值中文乱码之解决之道
2009/11/20 Javascript
jQuery 改变CSS样式基础代码
2010/02/11 Javascript
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
jquery入门—数据删除与隔行变色以及图片预览
2013/01/07 Javascript
JavaScript打印iframe内容示例代码
2013/08/20 Javascript
Javascript毫秒数用法实例
2015/02/05 Javascript
详解Node中导入模块require和import的区别
2017/08/11 Javascript
VueJs组件prop验证简单介绍
2017/09/12 Javascript
jQuery实现标签子元素的添加和赋值方法
2018/02/24 jQuery
vue-router中scrollBehavior的巧妙用法
2018/07/09 Javascript
JavaScript使用类似break机制中断forEach循环的方法
2018/11/13 Javascript
vue+Element实现搜索关键字高亮功能
2019/05/28 Javascript
微信小程序监听用户登录事件的实现方法
2019/11/11 Javascript
微信小程序利用云函数获取手机号码
2019/12/17 Javascript
vue项目开启Gzip压缩和性能优化操作
2020/10/26 Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
2020/11/04 Javascript
Python实现将数据写入netCDF4中的方法示例
2018/08/30 Python
python梯度下降法的简单示例
2018/08/31 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
2018/10/26 Python
python redis 删除key脚本的实例
2019/02/19 Python
Pytorch中.new()的作用详解
2020/02/18 Python
浅谈python3 构造函数和析构函数
2020/03/12 Python
python 通过文件夹导入包的操作
2020/06/01 Python
Expedia英国:全球最大的在线旅游公司
2017/09/07 全球购物
随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
2014/01/18 面试题
两则小学生的自我评价分享
2013/11/14 职场文书
招聘单位介绍信
2014/01/14 职场文书
出纳员岗位职责风险
2014/03/06 职场文书
党员干部廉洁自律承诺书
2015/04/28 职场文书
大国崛起日本观后感
2015/06/02 职场文书
五年级作文之成长
2019/09/16 职场文书