直接上代码了

Function.prototype.bind2 = function (context) {
    // context 是执行函数时的this指向
    if (typeof this !== "function") {
      throw new Error("only function can use bind");
    }
    var self = this; // 此处的this指向调用bind的函数
    var args = Array.prototype.slice.call(arguments, 1); // 获取除去第一个参数 的参数

    var fNOP = function () {};

    var fBound = function () {
        var bindArgs = Array.prototype.slice.call(arguments); // bind返回的函数调用时传递的参数
        // 当返回的函数单独调用时,this指向window  this instanceof fNOP为false 
        // 当返回的函数作为构造函数调用时,this指向fBound this instanceof fNOP为true
        return self.apply(this instanceof fNOP ? this : context, args.concat(bindArgs));
    }

    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();
    return fBound;
}
var value = 2;
var foo = {
    value: 1
};
function bar(name, age) {
    this.habit = 'shopping';
    console.log(this.value);
    console.log(name);
    console.log(age);
}

bar.prototype.friend = 'kevin';