企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## bind,call和apply的区别---改变this指向的方法 1、相同点: 三个函数都会改变this的指向(调用这三个函数的函数内部的this) 2、不同点: - 1)、bind 和call一样,但是bind会产生新的函数,(把对象和函数绑定死后,产生新的函数) - 2)、call和apply不会产生新的函数,只是在调用时,绑定一下而已。 - 3)、call和apply的区别,第一个参数都是要绑定的this,apply第二个参数是数组(是函数的所有参数),call把apply的第二个参数单列出来。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200113182652265.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ltYWdlX2Z6eA==,size_16,color_FFFFFF,t_70) ```javascript obj.myFun.call(db,'成都','上海');     // 德玛 年龄 99 来自 成都去往上海 obj.myFun.apply(db,['成都','上海']); // 德玛 年龄 99 来自 成都去往上海 obj.myFun.bind(db,'成都','上海')(); // 德玛 年龄 99 来自 成都去往上海 obj.myFun.bind(db,['成都','上海'])();   // 德玛 年龄 99 来自 成都, 上海去往 undefined ``` ## 实现call ``` // 给 context 添加一个属性 getValue.call(a, 'yck', '24') => a.fn = getValue // 将 context 后面的参数取出来 getValue.call(a, 'yck', '24') => a.fn('yck', '24') Function.prototype.myCall = function (context) { var context = context || window context.fn = this var args = [...arguments].slice(1) var result = context.fn(...args) delete context.fn return result } ``` ## 实现一个apply函数 ``` Function.prototype.myApply = function (context) { var context = context || window context.fn = this var result if (arguments[1]) { result = context.fn(...arguments[1]) } else { result = context.fn() } delete context.fn return result } ``` - bind ```js Function.prototype.myBind = function(context) { context = context || window; let fnSymbol = Symbol() context[fnSymbol] = this let fn = context[fnSymbol] return fn } ```