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接受数组参数形式
            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');

运行截图如下:

 

猜你喜欢

转载自www.cnblogs.com/surfer/p/9625725.html