bind是Function的方法,js5版的,在js3中可以用代替方案模拟,但依旧有些细节没法模拟。
/******************************* *bind函数在IE8中没有,兼容性代码:js权威指南(6th)P191 ********************************/ if (!Function.prototype.bind) { Function.prototype.bind = function (o/*, args*/) { if (typeof this !== "function") { // closest thing possible to the ECMAScript 5 internal IsCallable function throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable"); } var self=this, boundArgs=arguments; return function(){ var args=[],i; for(i=1; i<boundArgs.length; i++) args.push(boundArgs[i]); for(i=0; i<arguments.length; i++) args.push(arguments[i]); return self.apply(o, args); }; }; } /******************************* *bind函数在IE8中没有,兼容性代码:js权威指南(6th)P191 end ********************************/
/*******************************
*bind函数在IE8中没有,兼容性代码:某博客版
*(http://www.jb51.net/article/32837.htm)
********************************/
if (!Function.prototype.bind) {
Function.prototype.bind = function (oThis) {
if (typeof this !== "function") {
// closest thing possible to the ECMAScript 5 internal IsCallable function
throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");
}
var aArgs = Array.prototype.slice.call(arguments, 1),
fToBind = this, fNOP = function () {},
fBound = function (){
return fToBind.apply(this instanceof fNOP && oThis?this:oThis,
aArgs.concat(Array.prototype.slice.call(arguments)));
};
fNOP.prototype = this.prototype;
fBound.prototype = new fNOP();
return fBound;
};
}
/*******************************
*bind函数在IE8兼容性代码:某博客版。结束
********************************/
-------------------------------------------------------------------
具体用法
-------------------------------------------------------------------
o1对象有个f方法
想让o2对象继承o1的f方法
bind一下,o2对象就有这个现成的东西了。
//o2.f = o1.f.bind(o2);
//简练的bind写法1:
var f=function(x, y){ return (x+y);}
var o={};
g=f.bind(o,1);//绑定1到x;
alert( g(2) );
//简练的bind写法2:
//把f函数绑定到o上,并返回一个新方法:f.bind(o);
function f(x,y){ return x+y; }
var o={};
//var g=f.bind(o, 1); alert( 'g 是: '+ g(3) );
//或者
o.m=f.bind(o, 2); alert( o.m(10) );
//_________________________________
//把o1的f方法绑定到o2上,并返回一个新方法:o2.f = o1.f.bind(o2);
var o1={x:1, y:3};
o1.f = function(y){
return (this.x + this.y); }
var o2={x:50, y:8};
o2.y=8;
o2.f =o1.f.bind( o2 );//把o1.f绑定为o2.f
alert( o2.f() );
var g=o1.f.bind( o2 );//把f绑定到o2上并返回为一个新函数
alert( g() );