强制改变this指向的bind实现

实现部分功能

 function bind(f, thisArg) {
     return function() {
         thisArg.f = f;
         thisArg.f();
     }
 }
 
 function f() {
     console.log(this);
 }
 bind(f, [1, 2, 3])();

实现全部功能的版本

function bind (fn, thisArg) {
     if(typeof thisArg !== "object" && typeof thisArg !== "function"){
         switch(typeof thisArg) {
             case "string":
             thisArg = new String(thisArg);
             break;
             case "number":
             thisArg = new Number(thisArg);
             break;
             case "boolean":
             thisArg = new Boolean(thisArg);
             break;
             case "undefined":
             thisArg = window;
             break;
         }
     }else{
         thisArg === null && (thisArg = window);
     }

     var argsstr = "";

     for(var i = 2; i < arguments.length; i = i + 1){
         if(i === arguments.length - 1){
             argsstr = argsstr + arguments[i];
         }else{
             argsstr = argsstr + arguments[i] + ", ";
         }
     }

     // console.log(argsstr);
     
     return function () {
         thisArg.__originFn = fn;
         // thisArg.__originFn();
         eval('thisArg.__originFn(' + argsstr + ')');
         delete thisArg.__originFn;
     }
 }

 function f (x, y) {
     console.log(x + y);
     console.log(this);
 }

 bind(f, "456", 9, 6)();

最终版

Function.prototype.myBind = function(thisArg){
     switch (typeof thisArg) {
         case "number":
         thisArg = new Number(thisArg);
         break;
         case "string":
         thisArg = new String(thisArg);
         break;
         case "boolean": 
         thisArg = new Boolean(thisArg);
         break;
         case "undefined": 
         thisArg = window;
         break;
         case "object":
         if(thisArg === null){
             thisArg = window;
         }
         break;
     }

     var args = [];

     for(var i = 1; i < arguments.length; i = i + 1){
         args.push(arguments[i]);
     }

     thisArg.__tempMethod = this;
     return function(){
         // thisArg.__tempMethod();
         // console.log("thisArg.__tempMethod(" + args.join() + ");")
         eval("thisArg.__tempMethod(" + args.join() + ");");
         delete thisArg.__tempMethod;
     }
 }

 var f = function(x, y){
     console.log(x + y);
     console.log(this);
 }

 f.myBind([999], 55, 44)();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值