实现bind的两种方法

ES5中新增了一个bind方法,用于绑定函数this,使得调用栈更改之后this仍然不变,看个例子

function f(x,y){return this.x+this.y};
var a = {x:4,y:16};
f.bind(a);//=>bind方法返回的是函数,即:function f(x,y){return this.x+this.y}
f.bind(a)();//函数调用,结果为20

bind方法返回的是函数,他与call,apply都能改变函数内this的指向,但是返回不同,call、apply返回的是结果

bind是绑定this指向,call、apply可以理解为获取将函数扩展到某个对象上来的结果

Math.pow.call(null,2,3);//<=>Math.pow(2,3),也等价于下边
Math.pow.apply(null,[2,3]);//<=>Math.pow(2,3)
function add(){return this.x+this.y};
var a = {x:3,y:7,z:false};
add.bind(a)();//10
add.call(a);//10
add.apply(a);//10

实现bind的两种方法

1.

if(!Function.prototype.bind){
Function.prototype.bind = function(o){
var self = this,//第一层函数this保存为self
args,
args1=Array.prototype.slice.call(arguments,1);//获取传入bind函数除第一个参数外的所有参数
return function(){//返回的应该是一个函数
args2 = Array.prototype.slice.call(arguments);//获取传入返回函数的所有参数
args = args1.concat(args2)
self.apply(o,args);//应用到第一层函数
};
};
};

2.

if(!Function.prototype.bind){
Function.prototype.bind = function(o){
var self = this,
args,
args1=Array.prototype.slice.call(arguments,1),
fNOP = function(){},
fBound = function(){
return self.apply(this instanceof fNOP
?this
:o,
args1.concat(Array.prototype.slice.call(arguments)));
};
if (this.prototype){
fNOP.prototype = this.prototype;
}
fBound.prototype = new fNOP();
return fBound;
};
}