实现部分功能
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] + ", ";
}
}
return function () {
thisArg.__originFn = fn;
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(){
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)();