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  Error 对象 错误处理
May 18 Javascript
JavaScript 学习笔记(五)
Dec 31 Javascript
常见JS效果之图片减速度滚动实现代码
Dec 08 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
Aug 24 Javascript
使用mouse事件实现简单的鼠标经过特效
Jan 30 Javascript
自定义百度分享的分享按钮
Mar 18 Javascript
基于javascript实现彩票随机数生成(简单版)
Apr 17 Javascript
基于JavaScript实现瀑布流布局(二)
Jan 26 Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
Jul 21 Javascript
Javascript实现动态时钟效果
Nov 17 Javascript
开发中常用的25个JavaScript单行代码(小结)
Jun 28 Javascript
vue实现轮播图帧率播放
Jan 26 Vue.js
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
zf框架的校验器使用使用示例(自定义校验器和校验器链)
2014/03/13 PHP
PHP用星号隐藏部份用户名、身份证、IP、手机号等实例
2014/04/08 PHP
基于PHP实现的事件机制实例分析
2015/06/18 PHP
php curl 模拟登录并获取数据实例详解
2016/12/22 PHP
PHP快速推送微信模板消息
2017/04/14 PHP
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/06 Javascript
理解Javascript_13_执行模型详解
2010/10/20 Javascript
Javascript 异步加载详解(浏览器在javascript的加载方式)
2012/05/20 Javascript
js阻止冒泡及jquery阻止事件冒泡示例介绍
2013/11/19 Javascript
Javascript中匿名函数的多种调用方式总结
2013/12/06 Javascript
jQuery获得内容和属性示例代码
2014/01/16 Javascript
jQuery实现类似淘宝网图片放大效果的方法
2015/07/08 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
JavaScript进阶练习及简单实例分析
2016/06/03 Javascript
JS构造函数与原型prototype的区别介绍
2016/07/04 Javascript
JavaScript 监控微信浏览器且自带返回按钮时间
2016/11/27 Javascript
微信小程序ibeacon三点定位详解
2018/10/31 Javascript
Vue实现类似Spring官网图片滑动效果方法
2019/03/01 Javascript
通过seajs实现JavaScript的模块开发及按模块加载
2019/06/06 Javascript
解决vue-cli webpack打包开启Gzip 报错问题
2019/07/24 Javascript
关于vue3.0中的this.$router.replace({ path: '/'})刷新无效果问题
2020/01/16 Javascript
微信小程序实现电子签名功能
2020/07/29 Javascript
Django rest framework实现分页的示例
2018/05/24 Python
Numpy array数据的增、删、改、查实例
2018/06/04 Python
详解python3 + Scrapy爬虫学习之创建项目
2019/04/12 Python
python绘制多个子图的实例
2019/07/07 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
2020/01/20 Python
Java ExcutorService优雅关闭方式解析
2020/05/30 Python
意大利香水和彩妆护肤品购物网站:Ditano
2017/08/13 全球购物
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
合作投资意向书
2014/04/01 职场文书
机械工程及其自动化专业求职信
2014/08/08 职场文书
2014年领班工作总结
2014/11/25 职场文书
先进班组事迹材料
2014/12/25 职场文书
MySQL主从复制断开的常用修复方法
2021/04/07 MySQL
Pytorch使用shuffle打乱数据的操作
2021/05/20 Python