JavaScript语言精粹读书笔记 - JavaScript函数

JavaScript是披着C族语言外衣的LISP,除了词法上与C族语言类似之外,其余几乎没有类似之处。程序员

JavaScript 函数: 
函数包含一组语句,他们是JavaScript的基础模块单元,用于代码复用、信息隐藏和组合调用。 
函数用于指定对象的行为。 

函数对象Functions
: 
在JavaScript中函数就是对象。对象是“键值”对的集合并拥有一个链接到原型对象的隐藏链接。 
对象字面量产生的对象链接到Object.prototype。函数对象链接到Function.prototype(该原型对象自己链接到Object.prototype)。 
每一个函数在建立时都拥有两个附加属性:函数的上下文和实现函数行为的代码。 
每一个函数对象在建立时也随带有一个prototype属性,它的值是一个拥有constructor属性且值即为该函数的对象。 

函数字面量Function Literal: 
var add = function(a, b) {return a + b;}; 
经过函数字面量建立的函数对象包含一个连到外部上下文的链接,这被称为闭包。 

调用Invocation: 
调用一个函数将暂停当前函数的执行,传递控制权和参数给新函数。除了声明时定义的形式参数,每一个函数接收两个附加的属性:this和arguments。 
参数this在面向对象的编程中很是重要,它的值取决于调用的模式。JavaScript中一共有4中调用模式:方法调用模式、函数调用模式、构造器调用模式和apply调用模式。这些模式在如何初始化关键参数this上存在差别。 
调用运算符():跟在任何产生一个函数值的表达式以后的一对圆括号。当实际参数(arguments)的个数与形式参数(parameters)的个数不匹配时,不会致使运行时错误。 

方法调用模式:The Method Invocation Pattern 
当一个函数被保存为对象的一个属性时,咱们称它为一个方法。当一个方法被调用时,this被绑定到该对象。若是一个调用表达式包含一个属性存取表达式(即一个.号表达式或[subscript]下标表达式),那么它被看成一个方法来调用。 
方法可使用this去访问对象,因此它能从对象中取值或修改该对象。this到对象的绑定发生在调用的时候。这个“超级”迟绑定(very late binding)使得函数能够对this高度复用。经过this可取得他们所属对象的上下文的方法称为公共方法。 

函数调用模式:The Function Invocation Pattern 
当一个函数并不是一个对象的属性时,那么它被看成一个函数来调用。 
var sum = add(3,4); 
当函数以此模式调用时,this被绑定到全局对象。 
// 给myObject增长一个double方法(上面myObject对象已经有了属性value和方法increasement) 
myObject.double = function(){ 
var that = this; 
var helper = function() { 
that.value = add(that.value, that.value); 
}; 
// The Function Invocation Pattern 
helper(); 

// The Method Invocation Pattern 
myObject.double(); 
document.writeln(myObject.getValue()); 

构造器调用模式:The Constructor Invocation Pattern 
JavaScript是一门基于原型继承的预言。这意味着对象能够直接从其余对象继承属性。该语言是无类别的。这偏离了当今编程的主流。当今大多数语言都是基于类的语言。尽管原型继承有着强大的表现力,但他并不被普遍理解。JavaScript自己对其原型的本质也缺少信心,因此它提供了一套和基于类的语言相似的对象构建语法。 
若是在一个函数前面带上new来调用,那么将建立一个隐藏链接到该函数的prototype成员的新对象,同时this将会被绑定到那个新对象上。 
结合new前缀调用的函数被称为构造器函数。按照约定,他们保存在以大写格式命名的变量里。 

Apply调用模式:The Apply Invocation Pattern 
由于JavaScript是一门函数式的面向对象编程语言,因此函数能够拥有方法。 
apply方法让咱们构建一个参数数组并用其去调用函数。它也容许咱们选择this的值。 
apply方法接收两个参数。第一个参数将被绑定给this。第二个就是一个参数数组。 

参数Arguments: 
当函数被调用时,会获得一个“免费”奉送的变量arguments数组。经过它函数能够访问全部它被调用时传递给它的参数列表,包括那些没有被分配给函数声明时定义的形式参数的多余参数。这使得编写一个无须指定参数的函数成为可能。 
arguments是一个相似数组(array-like)的对象,他并非真正的数组。有length属性,但没有数组的其余方法。

返回Return: 
一个函数老是会返回一个值,若是没有指定返回值,则返回undefined。 
若是函数以在前面加上new前缀的方法来调用,且返回值不是一个对象,则返回this(该新对象)。 

异常Exceptions:try catch throw 

给类型增长方法: 
JavaScript容许给语言的基本类型增长方法(经过prototype)。 
Function.prototype.method = function (name, method) {if(this.prototype[name]){this.prototype[name] = method; return this;}}; 
经过给Function.prototype对象增长一个method方法,咱们就没必要键入prototype这个属性名。 
Number.method('integer', function () {return Math[this < 0 ? 'ceiling' : 'floor'](this);}); 
String.metho('trim', function () {return this.replace('/^\s+|\s+$/g','');}); 

经过给基本类型增长方法,咱们能够大大提升语言的表现力。由于JavaScript是原型继承的动态本质(在属性访问符调用时,一层一层检查),新的方法马上被赋予到全部的值(对象)上,哪怕值(对象)是在方法被建立以前就建立好了。 
另外一个须要注意的是for in 语句在原型上时表现很糟糕。能够用hasOwnProperty方法筛选出继承而来的属性。 

递归Recursion:汉诺塔难题 

做用域Scope: 
在编程语言中,做用域控制着变量与参数的可见性和生命周期。对程序员来讲这是一个重要的帮组,由于它减小了名称冲突,而且提供了自动内存管理。 

闭包Closure: 
做用域的好处是内部函数能够访问定义在它们外部的参数和变量(除了this和arguments)。 

回调Callbacks: 
模块Module: 
咱们可使用函数和闭包来构造模块。模块是一个提供接口却隐藏状态与实现的函数或对象。经过使用函数去产生模块,咱们几乎能够彻底摒弃全局变量的使用,从而缓解这个JavaScript的最为糟糕的特性之一所带来的影响。 
模块的通常形式:一个定义了私有变量和函数的函数;利用闭包建立能够访问私有变量和函数的特权函数。最后返回特权函数,或者把他们保存到一个能够访问到的地方。 

级联Cascade: 
有一些方法没有返回值。若是咱们让这些方法返回this而不是undefined,就能够启动级联(例子:jQuery的链式调用)。 

套用Curry: 
记忆Memoization: 
函数能够用对象去记住先前的结果,从而能避免无谓的运算。这种优化被称为记忆。 编程

相关文章
相关标签/搜索