ES3之bind方法的实现模拟
扩展Function原型方法,此处用myBind来模拟bind实现
Function.prototype.myBind = function(o /*,args*/){
//闭包无法获取this关键字,故用self进行保存
var self = this;
var boundArgs = arguments;
//返回闭包指针,则闭包的作用域(o和其他arguments)将被保存
return function(){
var Args = [];
//除去第一个对象形参之外的其他参数
for( i=1;i<boundArgs.length;i++ ){
Args.push( boundArgs[i] );
}
//获取调用期传入的形参
for( i=0;i<arguments.length;i++ ){
Args.push( arguments[i] );
}
//apply接受数组参数形式,将执行结果返回
return self.apply( o, Args);
}
}
//定义测试函数printProps
function printProps(/*,args*/){
//打印便于观察来自绑定阶段的形参和调用阶段的形参
console.log( arguments );
//打印绑定的调用上下文(context)中的属性
for( prop in this ){
console.log( prop+":"+this[prop] );
}
}
var o = {name:‘test’',age:28};
//调用myBind函数,返回闭包的指针,因此形参o和其他形参得以保存
var func = printProps.myBind(o,1,2,3);
func (4,5,6);
func('test1','test2','test3');
运行截图如下: