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 相关文章推荐
json跟xml的对比分析
Jun 10 Javascript
javascript EXCEL 操作类代码
Jul 30 Javascript
flexigrid 类似ext grid的JS表格代码
Jul 17 Javascript
JavaScript和JQuery的鼠标mouse事件冒泡处理
Jun 19 Javascript
Jquery中request和request.form和request.querystring的区别
Nov 26 Javascript
JavaScript实现刷新不重记的倒计时
Aug 10 Javascript
基于bootstrap的文件上传控件bootstrap fileinput
Dec 23 Javascript
关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案
Dec 23 Javascript
Django1.7+JQuery+Ajax验证用户注册集成小例子
Apr 08 jQuery
bootstrap手风琴折叠示例代码分享
May 22 Javascript
Vue中CSS动画原理的实现
Feb 13 Javascript
vue实现页面切换滑动效果
Jun 29 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/07/30 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
thinkPHP5.0框架URL访问方法详解
2017/03/18 PHP
PHP实现的分解质因数操作示例
2018/08/01 PHP
DOM 基本方法
2009/07/18 Javascript
JQuery异步加载无限下拉框级联功能实现示例
2014/02/19 Javascript
jQuery $.extend()用法总结
2014/06/15 Javascript
js获取json元素数量的方法
2015/01/27 Javascript
浅谈javascript中基本包装类型
2015/06/03 Javascript
jQuery中 delegate使用的问题
2015/07/03 Javascript
jQuery实现鼠标经过弹出提示信息的地图热点效果
2015/08/07 Javascript
Node.js 条形码识别程序构建思路详解
2016/02/14 Javascript
Bootstrap每天必学之附加导航(Affix)插件
2016/04/25 Javascript
javascript代码调试之console.log 用法图文详解
2016/09/30 Javascript
快速解决js开发下拉框中blur与click冲突
2016/10/10 Javascript
用vue和node写的简易购物车实现
2017/04/25 Javascript
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
详解element-ui设置下拉选择切换必填和非必填
2019/06/17 Javascript
Vue实现购物小球抛物线的方法实例
2020/11/22 Vue.js
教你安装python Django(图文)
2013/11/04 Python
使用django-suit为django 1.7 admin后台添加模板
2014/11/18 Python
Python3随机漫步生成数据并绘制
2018/08/27 Python
win8.1安装Python 2.7版环境图文详解
2019/07/01 Python
python实现简单井字棋游戏
2020/03/04 Python
python实现小程序推送页面收录脚本
2020/04/20 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
2020/08/22 Python
Python列表嵌套常见坑点及解决方案
2020/09/30 Python
美国嘻哈首饰购物网站:Hip Hop Bling
2016/12/30 全球购物
局域网标准
2016/09/10 面试题
软件测试工程师面试问题精选
2016/10/28 面试题
《唯一的听众》教学反思
2014/02/20 职场文书
综治宣传月活动总结
2014/04/28 职场文书
《从现在开始》教学反思
2016/02/16 职场文书
详解MySQL的Seconds_Behind_Master
2021/05/18 MySQL
html5 录制mp3音频支持采样率和比特率设置
2021/07/15 Javascript
MySQL常用慢查询分析工具详解
2022/08/14 MySQL