arguments是什么?
arguments 是一个类数组对象。代表传给一个function的参数列表

 var length = 5;function fn(){console.log(this.length);}var obj = {length:3,method(fn){fn();arguments[0]();}}obj.method(fn,1,2);

输出5,3

arguments0的意思,和arguments.0()的意思差不多(当然这么写是不允许的),你更可以这么理解:

arguments = {0: fn, //也就是 functon() {alert(this.length)} 1: 第二个参数, //12: 第三个参数, //2..., length: 3
}

argument对象调用fn函数,所以this指向arguments对象

arguments 转数组
法1:Array.prototype.slice.call(arguments);
法2:[ ].slice.call(arguments);
法3:Array.from(arguments) 是个非常推荐的方法,其可以将所有类数组对象转换成数组。
法4:Array.prototype.slice.call(arguments)
法5:
var arr=[];
for(var i=0;i<arguments.length;i++){
arr.push(arguments[i]);
}
法6:[…arguments]

修改 arguments 值
在严格模式与非严格模式下,修改函数参数值表现的结果不一样。

function foo(a) {   "use strict";console.log(a, arguments[0]);a = 10;console.log(a, arguments[0]);arguments[0] = 20;console.log(a, arguments[0]);}foo(1);输出:1 110 110 20另一个非严格模式的例子:function foo(a) {console.log(a, arguments[0]);a = 10;console.log(a, arguments[0]);arguments[0] = 20;console.log(a, arguments[0]);}foo(1);
输出结果为:1 110 1020 20

从上面的两个例子中可以看出,在严格模式下,函数中的参数与 arguments 对象没有联系,修改一个值不会改变另一个值。而在非严格模式下,两个会互相影响。

将参数从一个函数传递到另一个函数
下面是将参数从一个函数传递到另一个函数的推荐做法。

function foo() {

bar.apply(this, arguments);

}function bar(a, b, c) {

// logic

}

arguments 与重载
很多语言中都有重载,但 JavaScript 中没有。先看个例子:

function add(num1, num2) {

console.log("Method one");return num1 + num2;

}

function add(num1, num2, num3) {

console.log("Method two");return num1 + num2 + num3;

}

add(1, 2);

add(1, 2, 3);

执行结果为:

Method two

Method two

所以,JavaScript 中,函数并没有根据参数的不同而产生不同的调用。

是不是 JavaScript 中就没有重载了呢?并不是,我们可以利用 arguments 模拟重载。还是上面的例子。

function add(num1, num2, num3) {

if (arguments.length === 2) {console.log("Result is " + (num1 + num2));}else if (arguments.length === 3) {console.log("Result is " + (num1 + num2 + num3));}

}

add(1, 2);

add(1, 2, 3)

执行结果如下:

Result is 3Result is 6

ES6 中的 arguments

扩展操作符
function func() {

console.log(...arguments);

}

func(1, 2, 3);

执行结果是:

1 2 3

简洁地讲,扩展操作符可以将 arguments 展开成独立的参数。

caller
在一个函数调用另一个函数时,被调用函数会自动生成一个caller属性,指向调用它的函数对象。如果该函数当前未被调用,或并非被其他函数调用,则caller为null。

function testCaller() {
var caller = testCaller.caller;
alert(caller);
}

function aCaller() {
testCaller();
}

aCaller();

callee
当函数被调用时,它的arguments.callee对象就会指向自身,也就是一个对自己的引用。
由于arguments在函数被调用时才有效,因此arguments.callee在函数未调用时是不存在的(即null.callee),且解引用它会产生异常。

function aCallee(arg) {
alert(arguments.callee);
}

function aCaller(arg1, arg2) {aCallee();}

aCaller();

var num = (function(num){if(num<=1){return 1;}else{return num*arguments.callee(num-1);}})(5);alert(num); //结果为120

arguments详解相关推荐

  1. js 类数组arguments详解

    arguments并不是一个真正的数组,而是一个"类似数组(array-like)"的对象: 就像下面的这段输出,就是典型的类数组对象: [12, 23, callee: ƒ, S ...

  2. 燕十八老师高级JS之arguments详解

    arguments是什么? 答:是1个对象 是一个长的很很像数组的对象 arguments内容是什么? 答:是函数运行时的实参列表 (function (d,e,f){console.log(argu ...

  3. JavaScript Function.arguments 属性详解

    转载自   JavaScript Function.arguments 属性详解 arguments属性是正在执行的函数的内置属性,返回该函数的arguments对象.arguments对象包含了调用 ...

  4. 详解 js 函数中的 arguments

    详解 js 函数中的 arguments 1.什么 arguments 简单来说:arguments 是一个对应于传递给函数的参数的类数组对象 arguments 对象是所有(非箭头)函数中都可用的局 ...

  5. 详解arguments

    详解arguments arguments ( 1 )是一个在函数内使用的变量 ( 2 )是函数的天生自带的变量 ( 3 )是一个数据集合(承载数据的盒子) ​ 1. 承载的就是该函数被调用的时候传递 ...

  6. Java内存溢出详解之Tomcat配置

    Java内存溢出详解 转自:http://elf8848.iteye.com/blog/378805 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError ...

  7. oracle home 命令,$ORACLE_HOMEbin目录下所有命令的使用方法及命令详解

    求$ORACLE_HOME/bin目录下所有命令的使用方法及命令详解 如题. $ORACLE_HOME/bin目录下有很多命令,那我们平时用到的也不是太多,即使用到的那部分可能用法也不是完全能掌握,所 ...

  8. 在python中使用关键字define定义函数_python自定义函数def的应用详解

    这里是三岁,来和大家唠唠自定义函数,这一个神奇的东西,带大家白话玩转自定义函数 自定义函数,编程里面的精髓! def 自定义函数的必要函数:def 使用方法:def 函数名(参数1,参数2,参数-): ...

  9. 高性能千万级定时任务管理服务forsun使用详解

    Forsun高性能高精度定时服务,轻松管理千万级定时任务. 项目地址: https://github.com/snower/forsun 使用 linux 系统定时器提供精确到秒级的定时调度,长时间运 ...

最新文章

  1. Android SimpleAdapter显示ListView、GridView
  2. 手把手教你在windows10下进行openFoam调试
  3. 【ACR2015】依那西普按需维持治疗策略有效抑制RA骨破坏进展
  4. 数据库开发基本操作-配置SQL Server 2005 Express的身份验证方式,以及如何启用sa登录名...
  5. 《Android深度探索》第一章心得体会
  6. RocketMQ源码-基于Netty的通信层设计
  7. bsh.jar/beanshell下载链接
  8. 整人小程序【转自CSDN】
  9. JavaScript高级程序设计(读书笔记)(七)
  10. 水星无线网卡配置AP模式连接无线信号上不了网,怎么办?
  11. Could not set the project description for 'hotelseqbid.ws' because the project d
  12. 珍惜生命之水,节约从我做起
  13. 纤维水泥板及配件建筑材料英国UKCA认证—EN 492
  14. Domain Adaption
  15. POJ 3009 Curling 2.0-DFS
  16. Typora+gitee+PicGo+坚果云 实现Typora文件的保存完整保存
  17. 香港中文大学教授、麻省理工牛人林达华解说现代数学体系
  18. 聊一聊JAVA指针压缩的实现原理(图文并茂,让你秒懂)
  19. 微软2013校园招聘笔试题
  20. Windows10远程报错:由于CredSSP加密Oracle修正导致远程失败

热门文章

  1. Excel2016 打开表格右边空白窗口太宽不正常,怎么办?
  2. WIFI定位——访苏州优频科技总经理朱宇红博士
  3. 攻防世界——supersqli进阶
  4. 模拟退火算法——概率法解全局优化
  5. 炫酷的VS Code毛玻璃效果
  6. 施工企业信息化应用之路 及“工程承包项目管理软件”(第二届全国工程建设行业信息化高峰论坛讲稿)...
  7. 眼睛横纵比来做 侧眼眨眼检测 技术
  8. linux kickstart乱码,PXE+kickstart 批量安装部署centos6系统
  9. 用非阻塞式I/O模型降低CPU使用率
  10. Charm-crypto的安装以及简单实现的聚合签名算法