函数包涵一组语句,他们是javascript的基础模块单元,用于代码复用,信息隐藏和组合调用,一般来说,编程就是将一组需求分解成一组函数与数据结构的技能。
- javascript中的函数就是对象!
- 对象是“名/值”对的集合并拥有一个连到原型对象的隐藏链接。
- 每个函数对象在创建时也随配有一个 prototype 属性。
- 函数是对象,所有它们可以像任何其他的值一样被使用。函数可以保存在变量,对象和数组中。函数可以被当作参数传递给其他函数,函数也可以再返回函数。而且,因为函数是对象,所有函数可以拥有方法。
- 函数的与众不同是它们可以被调用。
- 第一部分 是保守字 function。
- 第二部分 是函数名,它可以被省略。函数可以使用它的名字递归的调用自己,如果没有给函数命名,就被称为匿名函数。
- 第三部分 是包围在圆括号中的一组参数。多个参数用逗号分隔。这些参数的名称将被定义为函数中的变量。它们不像普通的变量那样将被初始化为 undefined,而是在该函数被调用时初始化为实际提供的参数的值
- 第四部分 是包围在花括号中的一组语句,是主体,在被调用是执行。
调用一个函数会暂停当前函数的执行,传递控制权和参数给新的函数,除了声明,每个函数还接受两个附加的参数:this 和 arguments.this 的值取决于调用模式
当函数被保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时,this被绑定到该对象。方法可以使用this访问自己所属的对象,所有它能从对象中取值或对对象进行修改,通过this可取它们所属对象的上下文的方法称为公共方法。
当一个函数并非一个对象的属性时,那么它就被当作一个函数来调用。 以此模式调用函数时,this 被绑定到全局对象,如果该方法定义一个变量并给他赋值为this,那么它的内部函数就可以通过那个变量访问到this,按照约定,把那个变量命名为that.
在函数面前带上一个new来调用,那么背地将会创建一个链接到该函数的prototype 成员新对象,同时this 会被绑定到那个新对象上。
apply 方法让我们构建一个参数数组传递给调用函数,它也允许我们选择this的值,apply参数接受两个的值。
递归函数就是可以直接或间接的调用自身的一种函数,一般来说递归函数调用自身来解决它的子问题
作用域控制着变量于参数的可见性和生命周期,它减少了名称冲突,并且提供了自动内存管理。
作用域的好处是内部函数可以访问定义它们的外部函数的参数和变量
函数使得对不连续事件的处理变得更容易。 网络上的同步请求会导致客户端进入假死状态。如果网络传输或服务器很慢,响应会慢到让人无法接受 更好的方法是发起异步请求,提供一个当服务器的响应到达时随即触发的回调函数。异步函数立即返回,这样客户端就不会被阻塞。
- 我们可以使用函数和闭包来构建模块,模块是一个提供接口却隐藏状态与现实的函数或对象,通过使用函数产生模块,我们几乎可以完全摒弃全局变量的使用,从而缓解这个javaScript的最为糟糕的特性之一所带来的影响。
- 模块的一般形式是: 一个定义了私有变量和函数的函数;利用闭包创建可以访问私有变量和函数的特权函数;最后返回这个特权函数,或者把它们保存到一个可访问到的地方。
- 使用模块模式就可以摒弃全局变量的使用。它促进了信息隐藏和其他优秀的设计实践。对于程序的封装,或者构造其他单例对象,模块模式非常有效。
函数可以将先前操作的结果记录在某个对象里,从而避免无谓的重复运算。这种优化被称为记忆。