日期:2014-05-16  浏览次数:20396 次

《JavaScript 语言精粹》 学习笔记 —— 第四章 函数


第四章 函数

4.1、在JavaScript中,函数就是对象。
4.2、函数的对象连接到Function.prototype(该原型对象本身被连接到Object.prototype)。
4.3、函数在创建的时候附有两个附加的隐藏属性:函数上下文和实现函数行为的代码。
4.4、函数与其它对象的不同之处在于它可以被调用。
4.5、函数对象可以通过函数字面量来创建:
  函数字面量包括四个部分。
  第一部分是保留字function。
  第二部分是函数名,它可以被省略——即“匿名函数”。函数名可以用来递归地调用自己。
  第三部分是包围在圆括号中的一组参数。其中每个参数用逗号分隔。
  第四部分是包围在花括号中的一组语句。这些语句是函数的主体。它们在函数被调用是执行。
4.6、函数字面量可以出现在任何表达式允许出现的地方,函数也可以被定义在其它函数中。一个内部函数自然可以访问自己的参数和变量,同时它也能方便地访问它被嵌套在其中的那个函数的参数和变量。通过函数字面量创建的函数对象包含一个连接到外部上下文的连接。这被称为“闭包”。它是JavaScript强大表现力的根基。
4.7、调用一个函数将暂停当前函数的执行,传递控制权和参数给新函数。
4.8、除声明时定义的形参,每个函数还接收两个附加的参数:this和arguments。
4.9、参数this的值取决于调用的模式。在JavaScript中一共有四种调用模式:方法调用模式、函数调用模式、构造器调用模式和apply调用模式
4.10、当实际参数的个数和形式参数的个数不匹配时不会导致运行时错误。如果实际参数值过多,超出的参数值将被忽略。如果实际的参数值过少,缺失的值将会被替换为undefined。
4.11、对参数值不会进行类型检查,任何类型的值都可以被传递给参数。
4.12、方法调用模式:当一个函数被保存为对象的一个属性时,称它为一个“方法”。当一个方法被调用时,this被绑定到该对象。
演示Demo
4.13、函数调用模式:当一个函数并非一个对象的属性时,那么它被当作一个函数来调用:
  当函数以此模式被调用时,this被绑定到全局对象。这是语言设计上的一个错误。倘若正确,this应该绑定到外部函数的this变量。这个设计错的后果是方法不能利用内部函数来帮助它工作,因为内部函数被绑定了错误的值,所以不能共享该方法对对象的访问权。解决方案是该方法定义一个变量并给它赋值为this。
4.14、构造器调用模式:如果在一个函数前面带上new来调用,那么将创建一个隐藏连接到该函数的 prototype 成员的新对象,同时 this 将会被绑定到那个新对象上。
演示Demo
注: 作者不推荐这种写法,原因在下章阐述。
4.15、Apply 调用模式:因为 JavaScript 是一门函数式的面向对象编程语言,所以函数可以拥有方法。
apply 方法可以构建一个参数数组并勇气去调用函数。它也允许我们选择 this 的值。
apply 方法接收两个参数。第一个是将被绑定给 this 的值。第二个就是参数数组。
演示Demo
4.16、函数可以通过 arguments 数组访问所有它被调用时传递给它的参数列表。因为语言的一个设计错误,arguments 并不是一个真正的数组,它只是一个类似数组的对象。arguments 拥有一个 length 属性,但它缺少所有数组的方法。
4.17、一个函数总有一个返回值,如果没有指定则返回 undefined。
4.18、如果函数在前面加上 new 前缀来调用,且返回值不是一个对象,则返回 this (该新对象)。
4.19、throw 语句中断函数的执行。它抛出一个 exception 对象,该对象包含可识别异常类型的 name 属性和一个描述性的 message 属性。也可以添加其它属性。
4.20、递归函数是直接或间接地调用自身的函数。经典递归函数例子——汉诺塔(更多可见wiki:http://zh.wikipedia.org/wiki/%E6%B1%89%E8%AF%BA%E5%A1%94)。