前言

最近在看JavaScript相关的知识点,看到了老外的一本Javascript For Web Developers,遇到了一个知识盲点,觉得老外写的很明白很透彻,记录下来加深印象,下面是我摘出来的一些片段,片段下有对应的解释,希望也能帮助其他人扫除这个盲点。如有翻译的不得体的地方还请在评论区指出,不胜感激。

理解Javascript中的Arguments

Function arguments in ECMAScript don’t behave in the same way as function arguments in most other languages. An ECMAScript function doesn’t care how many arguments are passed in, nor does it care about the data types of those arguments. Just because you define a function to accept two arguments doesn’t mean you can pass in only two arguments. You could pass in one or three or none, and the interpreter won’t complain. This happens because arguments in ECMAScript are represented as an array internally. The array is always passed to the function, but the function doesn’t care what (if anything) is in the array. If the array arrives with zero items, that’s fine; if it arrives with more, that’ s okay too. In fact,there actually is an arguments object that can be accessed while inside a function to retrieve the values of each argument that was passed in.

Function arguments在ECMAScript中的行为并不像其他大多数语言中的函数参数。在ECMAScript中,function并不关心有多少个参数传入函数中,也不关心传入参数的数据类型。当你定义了一个有两个参数的函数时,并不意味着你一定要传递两个参数,你也可以传入一个或者三个甚至是不传,这并不影响函数的解释。发生这种现象的原因是在ECMAScript中的arguments代表的是一个内部的array,这个array有0个元素是可以的,包含多个元素也是可以的。实际上,在ECMAScript中有一个arguments对象,当function有参数传入的时候,可以根据索引去获取这个arguments对应的值。

The arguments object acts like an array (though it isn’t an instance of Array ) in that you can access each argument using bracket notation (the first argument is arguments[0] , the second is arguments[1] ,and so on) and determine how many arguments were passed in by using the length property. In theprevious example, the sayHi() function’s first argument is named name . The same value can be accessed by referencing arguments[0] . Therefore, the function can be rewritten without naming the arguments explicitly, like this:

arguments对象的行为有些类似于array,但是实际上它并不是Array的实例,在arguments中,可以通过索引的方式获取对应的值,例如第一个参数是arguments[0],第二个参数是arguments[1]等等,并且可以根据argumentslength属性获取传入的参数的数量。在之前的例子中,sayHi()函数的第一个参数命名为name,与之相同的值可以通过arguments[0]来获取。因此,function可以写成没有参数的形式,像这样:

function sayHi() {
console.log("Hello" + arguments[0] + "," + arguments[1]);
} SayHi("Jim","Have a good day!");

In this rewritten version of the function, there are no named arguments. The name and message arguments have been removed, yet the function will behave appropriately. This illustrates an important point about functions in ECMAScript: named arguments are a convenience, not a necessity. Unlike in other languages, naming your arguments in ECMAScript does not create a function signature that must be matched later on; there is no validation against named arguments.The arguments object can also be used to check the number of arguments passed into the function via the length property. The following example outputs the number of arguments passed into the function each time it is called:

在这个版本的代码中,并没有被命名的参数,namemessage参数被移除了,但是函数依然会正常执行,这依赖于ECMAScript重要的特性,参数的命名只是为了方便,并不是必须的。不像其他的语言,定义的函数命名了参数并不一定非要编写与之签名一致的函数,也没有强制验证命名参数。arguments对象还可以通过length属性来检查传入的参数的长度,下面的代码展示了每个函数被调用时传入参数的个数:

function howManyArgs() {
console.log(arguments.length);
}
howManyArgs("string", 45); //
howManyArgs(); //
howManyArgs(12); //

对我来说,之所以这里是一个知识盲点,或多或少与思维定势有些关系,以前总是认为function的参数和强类型语言是一样的,怎么定义的就怎么传递参数。但是,命名参数还是有好处的,不用通过arguments索引方式获取参数值。总之,扫除了一个知识盲点。

作者:悠扬的牧笛

博客地址:http://www.cnblogs.com/xhb-bky-blog/p/9361395.html

声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。如果您觉得文章对您有帮助,可以【打赏】博主或点击文章右下角【推荐】一下。您的鼓励是博主坚持原创和持续写作的最大动力!

  

【拾遗】理解Javascript中的Arguments的更多相关文章

  1. 理解JavaScript中的arguments,callee,caller,apply

    arguments 该对象代表正在执行的函数和调用它的函数的参数. [function.]arguments[n] 参数function :选项.当前正在执行的 Function 对象的名字. n : ...

  2. 深入理解JavaScript中创建对象模式的演变(原型)

    深入理解JavaScript中创建对象模式的演变(原型) 创建对象的模式多种多样,但是各种模式又有怎样的利弊呢?有没有一种最为完美的模式呢?下面我将就以下几个方面来分析创建对象的几种模式: Objec ...

  3. 深入理解javascript中执行环境(作用域)与作用域链

    深入理解javascript中执行环境(作用域)与作用域链 相信很多初学者对与javascript中的执行环境与作用域链不能很好的理解,这里,我会按照自己的理解同大家一起分享. 一般情况下,我们把执行 ...

  4. 理解javascript中的回调函数(callback)【转】

    在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...

  5. 理解JavaScript中的原型继承(2)

    两年前在我学习JavaScript的时候我就写过两篇关于原型继承的博客: 理解JavaScript中原型继承 JavaScript中的原型继承 这两篇博客讲的都是原型的使用,其中一篇还有我学习时的错误 ...

  6. 深入理解JavaScript中的属性和特性

    深入理解JavaScript中的属性和特性 JavaScript中属性和特性是完全不同的两个概念,这里我将根据自己所学,来深入理解JavaScript中的属性和特性. 主要内容如下: 理解JavaSc ...

  7. 【干货理解】理解javascript中实现MVC的原理

    理解javascript中的MVC MVC模式是软件工程中一种软件架构模式,一般把软件模式分为三部分,模型(Model)+视图(View)+控制器(Controller); 模型:模型用于封装与应用程 ...

  8. 理解javascript中的策略模式

    理解javascript中的策略模式 策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. 使用策略模式的优点如下: 优点:1. 策略模式利用组合,委托等技术和思想,有效 ...

  9. 深入理解javascript中的立即执行函数(function(){…})()

    投稿:junjie 字体:[增加 减小] 类型:转载 时间:2014-06-12 我要评论 这篇文章主要介绍了深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是 ...

随机推荐

  1. 03-03_启动weblogic domain

    本文重点: 直接启动weblogic 控制台访问 weblogic概念及手工启动脚本分析 启动weblogic 启动admin Server做了哪些事情     一.直接启动weblogic [roo ...

  2. 转:35个让人惊讶的 CSS3 动画效果演示

    本文收集了35个惊人的 CSS3 动画演示,它们将证明 CSS3 Transform 和 Transition 属性的强大能力.CSS 是网页设计非常重要的一部分,随着越来越多的浏览器对 CSS3 支 ...

  3. 转:jQuery插件开发全解析

    jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...

  4. [Spark Streaming_1] Spark Streaming 概述

    0. 说明 Spark Streaming 介绍 && 在 IDEA 中编写 Spark Streaming 程序 1. Spark Streaming 介绍 Spark Stream ...

  5. Custom Voice 操作步骤

    首先,准备数据 1.Unicode格式的Transcript 2wav格式语音数据,并打包 好,现在POSTMAN进行api测试. 先拿着订阅密钥(Subscription Key)获取令牌(Toke ...

  6. H.__mro__) MRO- C3算法

  7. 【Alpha 冲刺】 3/12

    今日任务总结 (未完成) 人员 今日原定任务 完成情况 遇到问题 贡献值 胡武成 完成API文档编写 已完成App端api,Web端api还在持续 时间紧 孙浩楷 理解掌握在线编辑插件使用 加深了对所 ...

  8. HTML DOM item() 方法

    一直不知道javascript还有类似jQ里面eq()的函数,原来原生javascript的item()有类似功能: 由于是原生javascript,先补习下children和childNodes的区 ...

  9. oracle 查看删除重复数据

    1.查询重复数据select * from 表名 where 重复字段(一般为主键)in (select 重复字段 from 表名 group by 重复字段 having count(WF_OID) ...

  10. 2019年春季学期《C语言程序设计II》助教注意事项

    本学期<C语言程序设计II>课程安排 理论课时24(1-12周),实验课时8(13周),课程设计课时16(14-15周) 理论课教学内容 附:教学进度表 本学期实验课和课程设计参考教材 & ...