企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] # 作用 创建一个新的函数,在调用时设置`this`关键字为提供的值。并在调用新函数时,将给定参数列表作为原函数的参数序列的前若干项。 <br> <br> # 功能 * 绑定this * 柯里化 ~~~ function add(a, b, c) { var i = a+b+c; console.log(i); return i; } var func = add.bind(undefined, 100);//给add()传了第一个参数a func(1, 2);//103,继续传入b和c var func2 = func.bind(undefined, 200);//给func2传入第一个参数,也就是b,此前func已有参数a=100 func2(10);//310,继续传入c,100+200+10 ~~~ <br> <br> # 模拟 关键点 * 判断 this 是否 Function * 维护原型关系,新返回的函数继承原函数 * 新函数调用时,判断是否为new调用,是则this指向当前this,否则指向bind调用时的第一个参数 * 新函数调用时,将bind调用时的参数与返回的函数func实际调用时的参数拼接 ~~~ Function.prototype.bind = function (oThis) { if (typeof this !== 'function') { // closest thing possible to the ECMAScript 5 // internal IsCallable function throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable'); } var aArgs = Array.prototype.slice.call(arguments, 1) // 函数调用的参数 var fToBind = this // 要调用的函数 var fNOP = function () { } // 空函数 var fBound = function () { // 直接调用func,this指向window // 使用new调用,this指向bind调用后的返回值,即fBound,其原型是foo return fToBind.apply(this instanceof fBound ? this : oThis, // 将bind调用时的参数与返回的函数func实际调用时的参数拼接 aArgs.concat(Array.prototype.slice.call(arguments))); }; // 维护原型关系 // 实现继承,相当于 fBound.prototype = Object.create(this.Prototype) if (this.prototype) { // Function.prototype没有prototype属性 fNOP.prototype = this.prototype; } // 下行的代码使fBound.prototype是fNOP的实例,因此 // 返回的fBound若作为new的构造函数,new生成的新对象作为this传入fBound,新对象的__proto__就是fNOP的实例 fBound.prototype = new fNOP(); return fBound; }; ~~~