Skip to content

Latest commit

 

History

History
53 lines (34 loc) · 3.06 KB

File metadata and controls

53 lines (34 loc) · 3.06 KB

本章将包含以下内容:

  • 为什么匿名函数如此重要
  • 如何引用函数并调用,包括递归
  • 设置函数属性
  • 应用函数上下文
  • 处理变长参数表
  • 判断一个对象是否为函数

在之前的章节,我们介绍了函数作为一等公民的一些特性,以及这些特性是如何构成了函数式编程风格。现在我们来看看如何使用这些特性来解决在网络编程中可能遇到的问题。

本章中精选的例子可以让你更深入的理解Javascrip函数,尽管有些看起来简单,却揭示了重要的概念,这些我们在将来的项目中将很快用到。

不多说了,我们先利用我们手头的知识,来见识一下js函数的强大。

4.1 Anonymous functions

或许你之前对这个概念不熟,但是如果想成为js忍者,你必须先弄懂它。它来源于其它函数式编程语言,如Schema,是一个重要的逻辑特性。

当我们创建了函数,但是需要在之后使用的时候,匿名函数就派上用场了,例如:把它存储在变量里,赋值给对象属性,或者作为回调函数(如在timeout或事件处理中)。在所有这些情况下,我们并不需要给函数命名并在后面使用。

如果你来自于一个强类型和面向对象编程语言,你会觉得函数、方法在使用前是被严格定义的,必须通过名字来引用,他们总是编译在二进制内的,是实在和持久的;而在js中,函数则显得非常空灵,他们按需定义,随时抛弃。

下面的例子展示了匿名函数的几种定义方法:

Listing 4.1 Common examples of using anonymous functions

  window.onload =                                 //#1 事件函数直接赋值
    function(){ assert(true, 'power!'); };        //#1

  var ninja = {
    shout: function(){                            //#2 作为属性
      assert(true,"Ninja");                       //#2
    }                                             //#2
  };

  ninja.shout();

  setTimeout(
    function(){ assert(true,'Forever!'); },        //#3 回调,不需要知道函数名
    500);

以上几个例子,test1、2可以通过属性名访问函数,因此不需要函数名;test3是回调函数,内核有自己的方法访问它,也不需要函数名。

注:有人可能觉得把函数赋值给变量或属性后,那个变量或属性就是函数名。其实这是不对的。在listing4.1中,通过check函数的name属性,你会发现它们都是空字符串。

在本书的其余部分,我们将看到更多的匿名函数,js正是在它基础上构建了函数式编程。我们后面也会大量使用函数式编程。函数式编程使用小巧的,通常无副作用的函数作为构建应用的基石。后面我们将看到,这更加符合网络应用的逻辑。

匿名函数因为不创建函数名,不会污染全局命名空间,所以我们将创建大量但小巧的匿名函数,而不是一个很大的,充满各种命令式语句的函数。

匿名函数还能解决很多问题,下面我们就来看看