`

JavaScript Garden - arguments 对象

阅读更多

arguments 对象

JavaScript 中每个函数内都能访问一个特别变量 arguments。这个变量维护着所有传递到这个函数中的参数列表。

注意: 由于 arguments 已经被定义为函数内的一个变量。
因此通过 var 关键字定义 arguments 或者将 arguments 声明为一个形式参数,
都将导致原生的 arguments 不会被创建。

arguments 变量不是一个数组(Array)。
尽管在语法上它有数组相关的属性 length,但它不从 Array.prototype 继承,实际上它是一个对象(Object)。

因此,无法对 arguments 变量使用标准的数组方法,比如 pushpop 或者 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,因为它已经被废除了。

分享到:
评论

相关推荐

    JavaScript_Garden_CN

    2. **函数**: 包括函数声明与表达式、`this`的工作原理、闭包与引用、`arguments`对象、构造函数、作用域与命名空间等内容,深入探讨了函数的灵活性和复杂性。 3. **数组**: 阐述了数组的遍历与属性、`Array`构造...

    【图像重建】霍夫曼图像重建(带面板)【含GUI Matlab源码 1168期】.md

    CSDN Matlab武动乾坤上传的资料均是完整代码运行出的仿真结果图,可见完整代码亲测可用,适合小白; 1、完整的代码内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    【PID仿真】基于matlab PID模拟水泥行业稳料仓重流程仿真【含Matlab源码 12028期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    【图像加密】行列像素置乱+DWT图像加密【含Matlab源码 675期】.md

    CSDN Matlab武动乾坤上传的资料均是完整代码运行出的仿真结果图,可见完整代码亲测可用,适合小白; 1、完整的代码内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    机器学习-数据标准化与连续属性离散化(含数据集及说明)

    机器学习_数据标准化与连续属性离散化(含数据集及说明)

    【图像分割】Snake模型图像分割【含Matlab源码 418期】.md

    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优化算法的实践与应用-2

    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的线性调频信号小波变换与短时傅里叶变换时频分析程序实现,基于matlab实现的线性调频信号的小波变,可实现信号的时频分析,有很清晰的二维色图。 包括连续小波变和短时傅里叶变时频图。 程序已调通,可直接运行。 ,基于Matlab;线性调频信号;小波变换;时频分析;二维色图;连续小波变换;短时傅里叶变换时频图;程序已调通。,基于MATLAB的线性调频信号小波变换与时频分析程序

    【图像分割】二值化+灰白质医学影像分割【含GUI Matlab源码 184期】.md

    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

    【毕业设计】java-springboot+vue甘肃非物质文化网站的设计与实现(完整前后端+mysql+说明文档+LunW).zip

    【毕业设计】java-springboot+vue甘肃非物质文化网站的设计与实现(完整前后端+mysql+说明文档+LunW).zip

    【热力学】基于matlab FVM和简单的层流加热通道流【含Matlab源码 11158期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    【车间调度】基于matlab鸽群算法PIO求解分布式置换流水车间调度DPFSP【含Matlab源码 6142期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 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

    java-springboot-vue反欺诈平台的设计源码(完整前后端-mysql-说明文档-LunW).zip

    11,2kw双向储能变换器:PFCLLC结构,实现整流逆变模式快速切换的仿真研究与应用实践,双向储能变换器:高效灵活的电力转换系统,支持整流与逆变模式切换的仿真研究与应用,11,2kw双向储能变器仿真

    11,2kw双向储能变换器:PFCLLC结构,实现整流逆变模式快速切换的仿真研究与应用实践,双向储能变换器:高效灵活的电力转换系统,支持整流与逆变模式切换的仿真研究与应用,11,2kw双向储能变器仿真,已工业应用。 pfcllc结构,可整流,可逆变。 整流模式下,pfc为单相pwm整流器,输入电压220V,50Hz,llc输出电压55V。 逆变模式下,llc输入电压55V,逆变输出220V,50Hz交流。 直接切标志位即可实现整流模式和逆变模式切。 波形可复现,可应用于实际工程参考。 未仿真缓启动过程。 ,双向储能变换器仿真; pfcllc结构; 整流逆变模式切换; 波形复现; 工业应用,好的,根据您提供的信息,为您提炼一个标题如下: 工业应用双模式储能变换器仿真:11,2kw PFCLLC结构,整流逆变一体,可复现波形 这个标题尽量简洁地概括了您提供的关键信息。

    (源码)基于IoT的工业工人智能头盔监控系统_1.zip

    # 基于IoT的工业工人智能头盔监控系统 ## 项目简介 本项目旨在开发一款结合物联网技术的智能头盔,该头盔旨在监测工人的实时工作环境并预测可能的事故风险。这款头盔的功能主要包括感应工人的体温、周边环境温度、有害气体检测、坠落检测以及工人在工厂中的位置定位。此头盔能够向云平台发送监测数据以便于实时监控,一旦发现异常条件如有害气体泄露等危险情况,头盔会启动警报蜂鸣器并发送短信通知监管团队。此项目以Arduino Uno作为微控制器进行原型设计,并采用ThingSpeak作为云计算平台。 ## 项目的主要特性和功能 1. 工人生命体征和环境参数监测包括体温、环境温度等数据的实时监测。 2. 有害气体检测检测工作环境中是否存在有害气体,并发出警报。 3. 坠落检测通过内置传感器检测工人是否发生坠落,及时发出警报。 4. 位置定位通过GPS或其他定位技术,追踪工人的位置信息。 5. 数据上传和云平台监控将头盔内的数据实时上传至云平台,方便远程监控。

    Optisystem仿真实践:八通道波分复用系统的设计与分析报告,Optisystem仿真案例:八通道波分复用系统的设计与性能分析,Optisystem仿真案例8-八通道波分复用系统 内容:本文首先分

    Optisystem仿真实践:八通道波分复用系统的设计与分析报告,Optisystem仿真案例:八通道波分复用系统的设计与性能分析,Optisystem仿真案例8-八通道波分复用系统 内容:本文首先分析了光纤通信以及波分复用技术基本原理,随后,介绍了波分复用系统中部分关键技术,光放大技术(掺铒光纤放大器)、色散补偿技术(DCF补偿技术)和非线性效应抑制技术。 列举在Optisystem仿真软件中用到的基本功能和元器件,并建立了波分复用传输系统的基本仿真模型,测量了波分复用和解复用后光信号的频谱,通过检测Q因子误码率等数据分析了波分复用设计方案的可行性,并得出了一些结论。 形式:程序+附带报告 ,关键技术; 波分复用系统; Optisystem仿真; 关键元器件; 频谱测量; Q因子误码率分析。,Optisystem仿真:八通道波分复用系统设计与分析

    【图像加密解密】基于matlab变键空间快速图像加密【含Matlab源码 9260期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    【车间调度】基于matlab被囊群算法TSA求解分布式置换流水车间调度DPFSP【含Matlab源码 6136期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

    【轨道缺陷检测】基于matlab声学和超声波传感器数据识别裂纹和其他轨道缺陷【含Matlab源码 10962期】.mp4

    海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

Global site tag (gtag.js) - Google Analytics