详解函数中的 arguments
arguments
是一个对应于传递给函数的参数的类数组对象, 它只定义在函数体内.
在使用的时候要注意以下几点:
arguments
对象是所有 (非箭头) 函数中都可用的局部变量.
::: tip 注意:
对于箭头函数,并不是没有 arguments
,而是没有 自己 的 arguments
:::
举个例子:
function foo () {setTimeout(() => {console.log(arguments)}, 1000);
}
foo(1, 2, 3)// 输出 [Arguments] { '0': 1, '1': 2, '2': 3 }
arguments
对象不是一个Array
,它类似于Array
它拥有索引元素和length
属性,可以被转换成一个真正的Array
var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);
const args = Array.from(arguments);
const args = [...arguments];
arguments
在函数中主要有两个用途:
- 用来判断有多少个参数传入函数, 还可以用来指代未命名的参数
- 除了数组元素和
length
属性, 还可以通过callee
属性解除函数体内的代码与函数名的耦合状态
arguments.callee
指向参数所属的当前执行的函数
举个例子:
function factorial (num) {if (num <= 1) {return 1;} else {return num * factorial(num-1)}
}
上述代码定义了一个阶乘函数,使用到了递归算法,但是函数名 factorial
与 函数执行紧紧耦合在一起,为了消除这种现象可以使用 arguments.callee
function factorial (num) {if (num <= 1) {return 1;} else {return num * arguments.callee(num-1);}
}
这样一来,不管函数调用叫什么名字,都可以完成递归调用.
但是现在已经不推荐使用 arguments.callee
原因:访问
arguments
是个很昂贵的操作,因为它是个很大的对象,每次递归调用时都需要重新创建。影响现代浏览器的性能,还会影响闭包。
所以需要再次改造 (利用立即执行函数来实现):
function factorial (num) {if (num <= 1) {return 1}let flag = 1;return (function fn () {flag *= num;num--;if (num != 0) fn()return flag})()
}
arguments.length
传递给函数的参数数量
该属性表示的是实际传入的参数个数而不是声明的参数个数
::: tip 注意
实参长度: arguments.length
形参长度: arguments.callee.length
:::
借此可以用来检查传入参数个数的正确性:
function check(args) {var actual = args.length; // 实际的参数个数var expected = args.callee.length; // 期待的参数个数if( actual != expected ) {throw new Error("参数个数有误,期望值:" + expected + ";实际值:" + actual);}
}
function fn(x,y,z) {check(arguments); // 检查参数个数的正确性return x+y+z;
}
详解函数中的 arguments相关推荐
- 详解 js 函数中的 arguments
详解 js 函数中的 arguments 1.什么 arguments 简单来说:arguments 是一个对应于传递给函数的参数的类数组对象 arguments 对象是所有(非箭头)函数中都可用的局 ...
- python open 打开是什么类型的文件-详解Python中open()函数指定文件打开方式的用法...
文件打开方式 当我们用open()函数去打开文件的时候,有好几种打开的模式. 'r'->只读 'w'->只写,文件已存在则清空,不存在则创建. 'a'->追加,写到文件末尾 'b'- ...
- python join_详解Python中的join()函数的用法
函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下: join(): 连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符) ...
- python中index函数_详解python中的index函数用法
1.函数的创建 def fun(): #定义 print('hellow') #函数的执行代码 retrun 1 #返回值 fun() #执行函数 2.函数的参数 普通参数 :要按照顺序输入参数 de ...
- mysql的json函数与实例_Mysql实例详解Mysql中的JSON系列操作函数
<Mysql实例详解Mysql中的JSON系列操作函数>要点: 本文介绍了Mysql实例详解Mysql中的JSON系列操作函数,希望对您有用.如果有疑问,可以联系我们. MYSQL必读前言 ...
- python中groupby()函数讲解与示例_详解python中groupby函数通俗易懂
一.groupby 能做什么? python中groupby函数主要的作用是进行数据的分组以及分组后地组内运算! 对于数据的分组和分组运算主要是指groupby函数的应用,具体函数的规则如下: df[ ...
- python3中input输入浅谈_详解Python3中的 input() 函数
详解Python3中的 input() 函数 一.知识介绍: 1.input() 函数,接收任意输入,将所有输入默认为字符串处理,并返回字符串类型: 2.可以用作文本输入,如用户名,密码框的值输入: ...
- python函数的使用场景_详解python中strip函数的使用场景
python strip()函数 介绍,需要的朋友可以参考一下 函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm) 删除s字符串中开头.结尾处,位于 rm删除序列的字符 s.l ...
- python中squeeze函数_详解pytorch中squeeze()和unsqueeze()函数介绍
squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的 ...
最新文章
- 查看linux是几位的操作系统
- JZOJ 5922. 【NOIP2018模拟10.23】sequence
- Mac 下安装并配置 Tomcat
- ubuntu16.04 配置nginx支持redis
- C++11 并发指南------std::thread 详解
- 打印屏蔽部分内容window.print()
- 《MicoPython入门指南》一书即将出版
- 用JSON-server模拟REST API
- HC-SR04 超声波原理图讲解与时序分析与arduino使用
- valine自定义表情正确打开方式
- win32如何处理组合键盘消息
- http2协议翻译(转)
- IC卡是什么意思?ID卡区别是?
- 以太坊用户体验的痛点
- Java+JSP+MySQL基于SSM的医院挂号就诊系统
- c 程序设计语言 好难,C程序设计语言难点及分析
- 分享三套美团面试经历+简单答案
- 关键词的选择在应用商城的重要性
- 【电气专业知识问答】问:蓄电池为何必须经常处于浮充电状态?浮充电应注意什么?
- Java8使用LocalDateTime获取正确的第几周和计算日期最佳方式