arguments
对象
JavaScript 中每个函数内都能访问一个特别变量 arguments
。这个变量维护着所有传递到这个函数中的参数列表。
注意: 由于 arguments
已经被定义为函数内的一个变量。
因此通过 var
关键字定义 arguments
或者将 arguments
声明为一个形式参数,
都将导致原生的 arguments
不会被创建。
arguments
变量不是一个数组(Array
)。
尽管在语法上它有数组相关的属性 length
,但它不从 Array.prototype
继承,实际上它是一个对象(Object
)。
因此,无法对 arguments
变量使用标准的数组方法,比如 push
, pop
或者 slice
。
虽然使用 for
循环遍历也是可以的,但是为了更好的使用数组方法,最好把它转化为一个真正的数组。
转化为数组
下面的代码将会创建一个新的数组,包含所有 arguments
对象中的元素。
Array.prototype.slice.call(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"
// 输入参数为: this, arg1, arg2...argN
Foo.method = function() {
// 结果: Foo.prototype.method.call(this, arg1, arg2... argN)
Function.call.apply(Foo.prototype.method, arguments);
};
译者注:上面的 Foo.method
函数和下面代码的效果是一样的:
Foo.method = function() {
var args = Array.prototype.slice.call(arguments);
Foo.prototype.method.apply(args[0], args.slice(1));
};
自动更新
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
的 getters 和 setters 方法总会被创佳;因此使用 arguments
对性能不会有什么影响。
除非是需要对 arguments
对象的属性进行多次访问。
ES5 提示: 这些 getters 和 setters 在严格模式下(strict mode)不会被创建。
译者注:在 MDC 中对 strict mode
模式下 arguments
的描述有助于我们的理解,请看下面代码:
// 阐述在 ES5 的严格模式下 `arguments` 的特性
function f(a) {
"use strict";
a = 42;
return [a, arguments[0]];
}
var pair = f(17);
assert(pair[0] === 42);
assert(pair[1] === 17);
然而,的确有一种情况会显著的影响现代 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
不再是一个单纯的内联函数 inlining(译者注:这里指的是解析器可以做内联处理),
因为它需要知道它自己和它的调用者。
这不仅抵消了内联函数带来的性能提升,而且破坏了封装,因此现在函数可能要依赖于特定的上下文。
因此强烈建议大家不要使用 arguments.callee
和它的属性。
ES5 提示: 在严格模式下,arguments.callee
会报错 TypeError
,因为它已经被废除了。
分享到:
相关推荐
2. **函数**: 包括函数声明与表达式、`this`的工作原理、闭包与引用、`arguments`对象、构造函数、作用域与命名空间等内容,深入探讨了函数的灵活性和复杂性。 3. **数组**: 阐述了数组的遍历与属性、`Array`构造...
CSDN Matlab武动乾坤上传的资料均是完整代码运行出的仿真结果图,可见完整代码亲测可用,适合小白; 1、完整的代码内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
CSDN Matlab武动乾坤上传的资料均是完整代码运行出的仿真结果图,可见完整代码亲测可用,适合小白; 1、完整的代码内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
机器学习_数据标准化与连续属性离散化(含数据集及说明)
CSDN Matlab武动乾坤上传的资料均是完整代码运行出的仿真结果图,可见完整代码亲测可用,适合小白; 1、完整的代码内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
IGJO: 基于金豺狩猎行为的创新优化算法,成功发表于《Expert Systems with Applications》并引领实际工程问题的替代解决方案,金豺启示:IGJO优化算法的实践与应用——2022年中科院一区SCI期刊《Expert Systems with Applications》高被引论文解析,改进金豺优化算法IGJO,(Golden Jackal optimization, GJO),该算法旨在为解决实际工程问题提供一种替代的优化方法。 GJO的灵感来自金豺的合作狩猎行为。 该成果于2022年发表在中科院1区top SCI期刊《Expert Systems with Applications》上,属于高被引lunwen。 采用多种策略进行改进,用来写lunwen很适合,最低也是一个核心期刊。 ,改进金豺优化算法IGJO; GJO灵感来源; 中科院1区SCI期刊发表; 高被引论文; 多种策略改进; 核心期刊适用,IGJO算法:金豺灵感下的工程优化新法
基于MATLAB的线性调频信号小波变换与短时傅里叶变换时频分析程序实现,基于MATLAB的线性调频信号小波变换与短时傅里叶变换时频分析程序实现,基于matlab实现的线性调频信号的小波变,可实现信号的时频分析,有很清晰的二维色图。 包括连续小波变和短时傅里叶变时频图。 程序已调通,可直接运行。 ,基于Matlab;线性调频信号;小波变换;时频分析;二维色图;连续小波变换;短时傅里叶变换时频图;程序已调通。,基于MATLAB的线性调频信号小波变换与时频分析程序
CSDN Matlab武动乾坤上传的资料均是完整代码运行出的仿真结果图,可见完整代码亲测可用,适合小白; 1、完整的代码内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
【毕业设计】java-springboot+vue个人云盘管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
【毕业设计】java-springboot+vue甘肃非物质文化网站的设计与实现(完整前后端+mysql+说明文档+LunW).zip
海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
java-springboot-vue反欺诈平台的设计源码(完整前后端-mysql-说明文档-LunW).zip
11,2kw双向储能变换器:PFCLLC结构,实现整流逆变模式快速切换的仿真研究与应用实践,双向储能变换器:高效灵活的电力转换系统,支持整流与逆变模式切换的仿真研究与应用,11,2kw双向储能变器仿真,已工业应用。 pfcllc结构,可整流,可逆变。 整流模式下,pfc为单相pwm整流器,输入电压220V,50Hz,llc输出电压55V。 逆变模式下,llc输入电压55V,逆变输出220V,50Hz交流。 直接切标志位即可实现整流模式和逆变模式切。 波形可复现,可应用于实际工程参考。 未仿真缓启动过程。 ,双向储能变换器仿真; pfcllc结构; 整流逆变模式切换; 波形复现; 工业应用,好的,根据您提供的信息,为您提炼一个标题如下: 工业应用双模式储能变换器仿真:11,2kw PFCLLC结构,整流逆变一体,可复现波形 这个标题尽量简洁地概括了您提供的关键信息。
# 基于IoT的工业工人智能头盔监控系统 ## 项目简介 本项目旨在开发一款结合物联网技术的智能头盔,该头盔旨在监测工人的实时工作环境并预测可能的事故风险。这款头盔的功能主要包括感应工人的体温、周边环境温度、有害气体检测、坠落检测以及工人在工厂中的位置定位。此头盔能够向云平台发送监测数据以便于实时监控,一旦发现异常条件如有害气体泄露等危险情况,头盔会启动警报蜂鸣器并发送短信通知监管团队。此项目以Arduino Uno作为微控制器进行原型设计,并采用ThingSpeak作为云计算平台。 ## 项目的主要特性和功能 1. 工人生命体征和环境参数监测包括体温、环境温度等数据的实时监测。 2. 有害气体检测检测工作环境中是否存在有害气体,并发出警报。 3. 坠落检测通过内置传感器检测工人是否发生坠落,及时发出警报。 4. 位置定位通过GPS或其他定位技术,追踪工人的位置信息。 5. 数据上传和云平台监控将头盔内的数据实时上传至云平台,方便远程监控。
Optisystem仿真实践:八通道波分复用系统的设计与分析报告,Optisystem仿真案例:八通道波分复用系统的设计与性能分析,Optisystem仿真案例8-八通道波分复用系统 内容:本文首先分析了光纤通信以及波分复用技术基本原理,随后,介绍了波分复用系统中部分关键技术,光放大技术(掺铒光纤放大器)、色散补偿技术(DCF补偿技术)和非线性效应抑制技术。 列举在Optisystem仿真软件中用到的基本功能和元器件,并建立了波分复用传输系统的基本仿真模型,测量了波分复用和解复用后光信号的频谱,通过检测Q因子误码率等数据分析了波分复用设计方案的可行性,并得出了一些结论。 形式:程序+附带报告 ,关键技术; 波分复用系统; Optisystem仿真; 关键元器件; 频谱测量; Q因子误码率分析。,Optisystem仿真:八通道波分复用系统设计与分析
海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作