`
hhr_michael
  • 浏览: 72723 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类
最新评论

JavaScript高级程序设计 (读书笔记3)

阅读更多
函数

函数是一组可以随时随地运行的语句,它们是ECMAScript的核心。

函数是由关键字function、函数名加一组参数以及置于括号中的要执行的代码声明的。

函数sayHi()未声明返回值,不过不必专门声明它(如在Java中使用void)。
同样的,即使函数确实有返回值,也不必明确地声明它。
该函数只需要使用return运算符后跟要返回的值即可。

另一个重要的概念是,与在Java中一样,函数在执行过return语句后停止执行代码。
因此,return语句后的代码都不会被执行。

如果函数无明确的返回值,或调用了没有参数的return语句,那么它真正返回的值是undefined。


1 无重载

ECMAScript中的函数不能重载。

可用相同的名字在同一个作用域中定义两个函数,而不会引发错误,但真正使用的是后一个函数。

2 arguments对象

在函数代码中,使用特殊对象arguments,开发者无需明确指出参数名,就能访问它们。

例如,在函数sayHi()中,第一个参数是message。
用arguments[0]也可以访问这个值,即第一个参数的值(第一个参数位于位置0,第二个参数位于位置1,依此类推)。
因此,无需明确命名参数,就可以重写函数:

还可用arguments对象检测传递给函数的参数个数,引用属性arguments.length即可。

ECMAScript不会验证传递给函数的参数个数是否等于函数定义的参数个数。
开发者定义的函数都可以接受任意个数的参数(根据Netscape的文档,最多能接受25个),而不会引发任何错误。
任何遗漏的参数都会以undefined传递给函数,多余的参数将忽略。

用arguments对象判断传递给函数的参数个数,即可模拟函数重载:

3 Function类

ECMAScript最令人感兴趣的可能莫过于函数实际上是功能完整的对象。Function类可以表示开发者定义的任何函数。

函数只不过是一种引用类型,它们的行为与用Function类明确创建的函数行为相同

尽管可用Function构造函数创建函数,但最好不要使用它,因为用它定义函数比用传统方式要慢得多。
不过,所有函数都应看作是Function类的实例。

因为函数是引用类型,所以它们也有属性和方法。

ECMAScript定义的属性length声明了函数期望的参数个数。

记住,无论定义了几个参数,ECMAScript函数可以接受任意多个参数(最多25个)。
属性length只是为查看默认情况下预期的参数个数提供了一种简便的方式。

Function对象也有与所有对象共享的标准valueOf()方法和toString()方法。
这两个方法返回的都是函数的源代码,在调试时尤其有用。

4 闭包

所谓闭包,是指词法表示包括不必计算的变量的函数,也就是说,该函数能使用函数外定义的变量。

在ECMAScript中使用全局变量是一个简单的闭包实例。

在一个函数中定义另一个函数会使闭包变得更复杂,如下所示:

var iBaseNum = 10;

function addNumbers(iNum1, iNum2) {

     function doAddition() {

          return iNum1 + iNum2 + iBaseNum;

     }

     return doAddition();

}

这里,函数addNumbers()包括函数doAddition()(闭包)。
内部函数是个闭包,因为它将获取外部函数的参数iNum1和iNum2以及全局变量iBaseNum的值。
addNumbers()的最后一步调用了内部函数,把两个参数和全局变量相加,并返回它们的和。

这里要掌握的重要概念是doAddition()函数根本不接受参数,它使用的值是从执行环境中获取的。
分享到:
评论

相关推荐

    javascript 高级程序设计 读书笔记(3)

    NULL 博文链接:https://shaw-n-lu.iteye.com/blog/1881210

    JavaScript高级程序设计 读书笔记之八 Function类及闭包

    Function类 定义 Function类可以表示开发者定义的任何函数,用Function类直接创建函数的语法如下: var function_name=new Function(agrument1,agrument2,…,argumentN,function_body); 每个argument都是一个参数,...

    对javascript的一点点认识总结《javascript高级程序设计》读书笔记

    l ECMAScript,有ECMA-262定义,明确javascript这门语言的规则和约定,好比为开始一场游戏指定的游戏规则、规范、约定。 l DOM:提供访问和操作网页内容的方法和接口 l BOM,提供与浏览器交互的方法和接口 ECMA-262规定...

    JavaScript高级程序设计 读书笔记之十一 内置对象Global

    内置对象 定义:由ECMAScript实现提供的、独立于宿主环境的所有对象,在ECMAScript程序开始执行时出现。 由定义可知开发者不必明确实例化内置对象,它已被实例化了。在ECMAScript-262只定义了两个内置对象,即Global...

    JavaScript高级程序设计 读书笔记之十 本地对象Date日期

    要注意的是在JavaScript中月份的值是从0到11(0表示1月)。 设置日期和时间值 设置日期和时间值有两种方法: 1、只声明距离1970年1月1日凌晨12点的毫秒数 a、直接用距离1970年1月1日凌晨12点的毫秒数 var d=new Date...

    JavaScript高级程序设计 读书笔记之九 本地对象Array

    创建Array对象 代码如下: //one var aValues=new Array(); //two var aValues=new Array(20); //three var aColors=new Array(); aColors[0]=”red”; aColors[1]=”green”; aColors[2]=”blue”;...

    Reading-Notes:读书笔记们

    JavaScript高级程序设计(第三版) You don't know JS 系列 ES6 标准入门 Node.JS深入浅出 图解HTTP HTTP权威指南 Head First Java CSS3揭秘 Linux Command Line 大型网站技术架构核心原理与案例分析 锋利的jQuery ...

    JavaScript 函数惰性载入的实现及其优点介绍

    最近看JavaScript高级程序设计,大有收获,接下来几天写一下读书笔记。之前写了一篇Ajax初步理解的随笔,里面有个函数用来创建XmlHttpRequest对象,浏览器兼容性原因,写出的代码通过大量if判断或者try,catch语句将...

    Javascript 面向对象 (声明篇)

    由于才疏学浅,我不得不将《Javascript 高级程序设计》中的部分内容摘抄过来,这些同时也算是我的读书笔记吧。由于 Javascript 面向对象机制及其的重要,而且内容非常的繁多,在这里就分篇章逐个介绍。 使用对象首先...

    my-blog:自己的博客

    JavaScript深入理解系列读书笔记系列这部分只会记载一些笔记,不会深入解读电子书链接:提取码:wube《你不知道JavaScript》中册《JavaScript高级程序设计》数据结构栈队列链表哈希表树图浏览器部分浏览器的主要进程...

    疯狂的java讲义源码-ReadingBooks:读书笔记整理

    《JavaScript高级程序设计(第3版)》 学习JS和前端必读的书籍,比较厚但是很有干货涉及面比较广,里面的重要章节我自己是读了不止一遍。 2、 《ES6标准入门》 阮一峰编着,作者讲事情的思路一向比较清晰,也是学ES6...

    asp.net知识库

    Essential .NET 读书笔记 [第一部分] NET FrameWork的Collections支持 .NET的反射在软件设计上的应用 关于跨程序集的反射 实现C#和VB.net之间的相互转换 深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述...

Global site tag (gtag.js) - Google Analytics