函数对象
对象字面量产生的对象连接到Object.prototype
函数对象连接到Function.prototye
函数是对象。
函数字面量
var add = function(a,b){<br> return a + b;<br>}
闭包,通过函数字面量创建的函数对象包含一个连到外部上下文的连接
调用
调用模式
方法调用模式
函数调用模式
构造器调用模式
apply调用模式
每个函数都接收两个附加参数:this, arugments
实际参数与形式参数个数不匹配时不会报错
过多的参数会被忽略
缺少的参数为undefined
方法调用模式
方法:一个函数被保存为对象的一个属性
一个方法被调用时,this被绑定至该对象
公共方法:通过this可取得所属对象的上下文的方法
函数调用模式
var sum = add(3,4);<br>以这种方式调用函数,this被绑定到全局对象
使用var that = this来解决
构造器调用模式
使用new来调用函数<br>var Quo = function(string){<br> this.status = string;<br>}<br>var myQuo = new Quo("str");
创建一个连接到该函数的prototype成员的新对象,this被绑定至新对象
Apply调用模式
接收两个参数,(要绑定给this的值,参数数组)
var statusObject = { status: 'A-ok' };<br>//statusObject没有继承Quo.prototype,但可调用Quo原型方法<br>var status = Quo.prototype.get_status.apply(statusObject);
参数
arguments只是类似数组的对象。拥有一个length属性。不具有任何数组方法
返回
一个函数总会返回一个值。若没有指定则返回undefined
若函数调用时在前面加了new前缀,且返回值不是一个对象,则返回this(新对象)
异常
throw
一个try语句只会有一个捕获所有异常的catch代码块
扩充类型的功能
Function.prototype.method = function(name, func){<br> if(!this.prototype[name]){<br> this.prototype[name] = func;<br> }<br> return this;<br>}
闭包
糟糕的例子<br>var add_the_handlers = function(nodes){<br> var i;<br> for(i = 0; i < nodes.length; i++){<br> nodes[i].onclick = function(e){<br> alert(i);<br> }<br> }<br>}
改良的例子<br>var add_the_handlers = function(nodes){<br> var helper = function(i){<br> return function(e){ alert(i); }<br> }<br> var i;<br> for(i = 0; i < nodes.length; i++){<br> nodes[i].onclick = helper(i);<br> }<br>}
回调
同步请求会导致客户端进入假死状态。若网络传输或服务器很慢,响应更慢
发起异步请求,提供一个当服务器的响应到达时随即触发的回调函数。异步函数立即返回
模块
一般形式:一个定义了私有变量和函数的函数;<br>利用闭包创建可访问私有变量和函数的特权函数,<br>最后返回这个特权函数
级联
让没有返回值的方法返回this,则可采用级联,<br>依次调用同一个对象的很多方法
getElement('myBoxDiv')<br> .width(100)<br> .height(100)<br> .color("red")
记忆
e.g.用数组去保存fibonacci的结果,避免重复调用