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 相关文章推荐
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
Feb 26 Javascript
基于jquery的cookie的用法
Jan 10 Javascript
JQuery判断HTML元素是否存在的两种解决方法
Dec 26 Javascript
node.js中的fs.fchown方法使用说明
Dec 16 Javascript
JavaScript数据类型详解
Apr 01 Javascript
JS实现仿QQ效果的三级竖向菜单
Sep 25 Javascript
jQuery绑定事件on()与弹窗的简要概述
Apr 27 Javascript
node.js插件nodeclipse安装图文教程
Oct 19 Javascript
BootStrap下jQuery自动完成的样式调整
May 30 Javascript
AngularJS 作用域详解及示例代码
Aug 17 Javascript
vue项目中使用particles实现粒子背景效果及遇到的坑(按钮没有点击响应)
Feb 11 Javascript
npx create-react-app xxx创建项目报错的解决办法
Feb 17 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
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
PHP通过引用传递参数用法分析
2016/12/01 PHP
javascript获得服务器端控件的ID的实现代码
2011/12/28 Javascript
巧用jquery解决下拉菜单被Div遮挡的相关问题
2014/02/13 Javascript
javascript的propertyIsEnumerable()方法使用介绍
2014/04/09 Javascript
jquery动态分页效果堪比时光网
2014/09/25 Javascript
jQuery的观察者模式详解
2014/12/22 Javascript
深入理解jquery跨域请求方法
2016/05/18 Javascript
微信小程序 获取当前地理位置和经纬度实例代码
2016/12/05 Javascript
ThinkPHP+jquery实现“加载更多”功能代码
2017/03/11 Javascript
jQuery插件ContextMenu自定义图标
2017/03/15 Javascript
详解Vue webapp项目通过HBulider打包原生APP
2018/06/29 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
微信小程序全选多选效果实现代码解析
2020/01/21 Javascript
基于js实现判断浏览器类型代码实例
2020/07/17 Javascript
如何利用vue实现波谱拟合详解
2020/11/05 Javascript
javascript 数组(list)添加/删除的实现
2020/12/17 Javascript
[19:24]DOTA2客户端使用指南 一分钟快速设置轻松超神
2013/09/24 DOTA
[55:47]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第三局
2016/02/27 DOTA
python文件和目录操作方法大全(含实例)
2014/03/12 Python
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
Ubuntu下Python2与Python3的共存问题
2018/10/31 Python
python psutil模块使用方法解析
2019/08/01 Python
Django实现发送邮件找回密码功能
2019/08/12 Python
python lambda表达式(匿名函数)写法解析
2019/09/16 Python
Python实现数值积分方式
2019/11/20 Python
python处理RSTP视频流过程解析
2020/01/11 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
2020/06/08 Python
保加利亚运动鞋购物网站:SneakerStudio.bg
2020/12/23 全球购物
大学生职业生涯规划方案
2014/01/03 职场文书
医院检讨书范文
2014/02/01 职场文书
大专应届毕业生求职信
2014/07/15 职场文书
学校副校长四风对照检查材料整改措施
2014/09/25 职场文书
后进生评语大全
2015/01/04 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
OpenCV-Python 实现两张图片自动拼接成全景图
2021/06/11 Python