Javascript学习笔记之函数篇(四):arguments 对象

 更新时间:2014年11月23日 10:53:59   投稿:hebedich  
JavaScript中arguments函数对象是该对象代表正在执行的函数和调用它的函数的参数。JavaScript 函数中 arguments 为特殊对象,无需明确指出参数名,就能访问它们。

每一个 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)

相关文章

  • ECMAscript 变量作用域总结概括

    ECMAscript 变量作用域总结概括

    这篇文章主要介绍了ECMAscript 变量作用域,通过使用var操作符声明和未使用var操作符声明两种情景做出了解释,具体操作步骤大家可查看下文的详细讲解,感兴趣的小伙伴们可以参考一下。
    2017-08-08
  • JavaScript中switch语句的用法详解

    JavaScript中switch语句的用法详解

    这篇文章主要介绍了JavaScript中switch语句的用法详解,是JS入门学习中的基础知识,需要的朋友可以参考下
    2015-06-06
  • Javascript中的几种继承方式对比分析

    Javascript中的几种继承方式对比分析

    下面小编就为大家带来一篇Javascript中的几种继承方式对比分析。小编觉得挺不错的,现在分享给大家,希望能给大家一个参考。一起跟随小编过来看看吧
    2016-03-03
  • JavaScript的三座大山之单线程和异步

    JavaScript的三座大山之单线程和异步

    这篇文章主要为大家详细介绍了JavaScript之单线程和异步,使用JavaScript,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • javascript开发技术大全-第1章javascript概述

    javascript开发技术大全-第1章javascript概述

    JavaScript 为 HTML 设计师提供了一种编程工具HTML 创作者往往都不是程序员,但是 JavaScript 却是一种只拥有极其简单的语法的脚本语言!几乎每个人都有能力将短小的代码片断放入他们的 HTML 页面当中。
    2011-07-07
  • Javascript 动态改变imput type属性

    Javascript 动态改变imput type属性

    这篇文章主要介绍了Javascript 动态改变imput type属性的相关资料,并附简单实例代码,需要的朋友可以参考下
    2016-11-11
  • js学习之----深入理解闭包

    js学习之----深入理解闭包

    本篇文章主要介绍了js的闭包,闭包算是js里面比较不容易理解的点,现在整理出来分享给大家,有需要的可以了解一下。
    2016-11-11
  • Javascript中的五种数据类型详解

    Javascript中的五种数据类型详解

    这篇文章主要介绍了Javascript中的五种数据类型详解,需要的朋友可以参考下
    2014-12-12
  • js玩一玩WSH吧

    js玩一玩WSH吧

    js玩一玩WSH吧...
    2007-02-02
  • JavaScript入门之语言基础

    JavaScript入门之语言基础

    本文通过全面列举基础的JavaScript概念这一方式来阐述该语言的基本原理,以此来为初学者提供一个对语言的基本了解,随处可见的代码例子则是用来说明所有的这些概念是如何在语言中体现出来的
    2011-10-10

最新评论