Function 扩展

bind():bind(thisObj[,arg...])->Function

bindAsEventListener:bindAsEventListener(thisObj[,arg...])->Function

//下面给出这两种方法实现
Function.prototype.bind = function() {
       var __method = this, args = $A(arguments), object = args.shift();
       return function() {
           return __method.apply(object, args.concat($A(arguments)));
       }
}

Function.prototype.bindAsEventListener = function(object) {
    var __method = this, args = $A(arguments), object = args.shift();
    return function(event) {
        return __method.apply(object, [event || window.event].concat(args));
    }
}

这两个方法的实现代码是这样的,说白了就是Function.apply(object[,args])方法在起作用,记住此处的Object指向调用该函数的对象

Javascript中的call()和apply() (摘自<<Javascript高级程序设计>> Nicholas C.Zakes)

call()方法是一种对象冒充的方法,它的第一个参数是用作this的对象,其他函数都自己界传递给函数自身.例如function sayColor(sPrefix,sSuffix)
{
    alert(sPrefix + this.color + sSuffix) ;
};

var obj =new Object();
obj.color="red";
sayColor.call(obj,"The Color is ",",a nice color!");
//outputs "The Color is red,a nice color!"

在这个例子中,函数sayColor()在对象外定义,即使他不属于任何对象,也可以引用关键字this,对象obj的color属性等于'red'.调用cacll()方法时,第一个参数是obj,说明应该赋予saycolor()函数的this关键子值是obj.第二个参数和第三个参数是字符串.他们与saycolor()函数中的参数prefix和suffix匹配.最后生成的消息是"The Color is red,a nice color!"

apply()方法有两个参数,用作this的对象和要传递给参数的数组.例如
function sayColor(sPrefix,sSuffix)
{
   alert(sPrefix + this.color + sSuffix) ;
}
var obj =new Object();
obj.color="red";
sayColor.call(obj,new Array( "The Color is ",",a nice color!"));
//outputs "The Color is red,a nice color!"
这个例子和上面的例子相同,只是调用的是apply()方法.调用apply()方法时,第一个参数仍是obj,说明应该赋予sayColor()中的this关键字值是obj.第二个参数是参数数组,与prefix和suffix匹配.